设计模式-装饰者模式
装饰者模式(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便使用了装饰者模式。