设计模式-装饰者模式
装饰者模式(Decorator)
装饰者模式(Decorator):动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
装饰者模式结构:

抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类
装饰角色(Decorator):持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口
具体装饰角色(ConcreteDecorator):负责给构件对象“贴上”附加的责任

//Component:给出一个抽象接口,以规范准备接收附加责任的对象。
public abstract class Beverage{
//说明
public String description = "Unkonwn Beverage";
//获取说明信息
public String getDescription(){
return description;
}
//价格
public abstract BigDecimal cost();
}
//ConcreteComponent:定义一个将要接收附加责任的类
public class DarkRoast extends Beverage{
//初始化名称
public DarkRoast() {
description = "深焙咖啡";
}
//返回价格
@Override
public BigDecimal cost() {
return new BigDecimal("5.9");
}
}
//Decorator:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口
public abstract class CondimentDecorator extends Beverage{
//用变量记录被装饰者
Beverage beverage;
}
//ConcreteDecorator:负责给构件对象“贴上”附加的责任
public class Milk extends CondimentDecorator{
//记录被装饰着
public Milk(Beverage beverage) {
this.beverage = beverage;
}
//返回被装饰者与装饰者说明
@Override
public String getDescription() {
return beverage.getDescription() + "+Milk";
}
//返回装饰者与被装饰者价格总合
@Override
public BigDecimal cost() {
return beverage.cost().add(new BigDecimal("1"));
}
}
设计原则:
1、类应该对扩展开放,对修改关闭(开闭原则)
2、多用组合,少用继承。
优点:
1、装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
缺点:
1、多层装饰比较复杂。
应用场景:
1、扩展一个类的功能。
2、动态增加功能,动态撤销。
实际使用:这里我们说一下,在java中I/O便使用了装饰者模式。


浙公网安备 33010602011771号