对于很多程序员,平时写代码为了方便,可能一股脑就按面向过程那样一下把业务逻辑编写下来,少有会去额外思考设计模式或者算法。这种情况其实不利于我们的编码维护,在本文,将介绍设计模式中的观察者模式,通过本文的介绍将帮助你快速理解和应用。
装饰器模式是一种结构型设计模式,是在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式
装饰器模式包括以下几个角色:
(1)抽象构建Component
定义了被装饰对象的接口或抽象类,也是所有具体组件的共同父类
(2)具体构建ConcreteComponent
实现了Component接口的具体对象,是被装饰对象的基本实现
(3)装饰角色Decorator
保持一个指向Component对象的引用,并定义与Component接口一致的接口。
Decorator还可以维护一个装饰器链,以便动态地添加和删除装饰器对象
(4)具体装饰角色ConcreteDecorator
通过添加一些额外的行为来扩展Component对象的功能,它们实现了Decorator接口并且具有被装饰对象的引用。
假设我们去早餐店购买肠粉,需要给每份肠粉添加不同的配菜,我们可以使用装饰器模式来动态添加配料,而无需为每种可能
的配料创建一个子类。
//抽象构建
public interface Powder {
//价格
BigDecimal getCost();
//描述
String getDesc();
}
//具体构建ConcreteComponent
public class RollPowder implements Powder{
@Override
public BigDecimal getCost() {
return new BigDecimal("4.0");
}
@Override
public String getDesc() {
return "斋粉";
}
}
//Decorator
abstract class PowderDecorator implements Powder{
private BigDecimal price = BigDecimal.ZERO;
protected final Powder decoratedPowder;
public PowderDecorator(Powder powder){
this.decoratedPowder = powder;
}
@Override
public BigDecimal getCost(){
return decoratedPowder.getCost();
}
@Override
public String getDesc(){
return decoratedPowder.getDesc();
}
}
该类装饰是加鸡蛋
public class EggDecorator extends PowderDecorator {
private BigDecimal price = new BigDecimal(1);
public EggDecorator(Powder powder) {
super(powder);
}
@Override
public BigDecimal getCost() {
return super.getCost().add(price);
}
@Override
public String getDesc() {
return super.getDesc() + ",加蛋";
}
}
@GetMapping(value = "/decorator", produces = MediaType.APPLICATION_JSON_VALUE)
public void decorator() {
Powder powder = new RollPowder();
powder = new EggDecorator(powder);
System.out.println(powder.getCost());
System.out.println(powder.getDesc());
}