装饰者模式(Decorator Pattern)(对象结构型设计模式)
——动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
设计原则
- 类应该对扩展开放,对修改关闭。(开放—关闭原则。)
结构
Component
- 定义一个对象接口,可以给这些对象动态的添加职责。
ConcreteComponent
- 定义一个对象,可以给这个对象添加一些职责。
Decorator
- 维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。
ConcreteDecorator
- 向组件添加职责。
Java I/O
——真实世界的装饰者。
”黑暗面“
- 在设计中加入大量的小类。
- 代码会依赖特定的类型。
- 实例化组件时,会增加代码的复杂度。(工厂模式和生成器模式对这个问题有帮助。)
For example
public abstract class Beverage {
String description = "Unknown Beverage";
public String getDescription()
{
return description;
}
public abstract double cost();
}
public abstract class CondimentDecorator extends Beverage{
public abstract String getDescription();
}
public class Espresso extends Beverage{
public Espresso()
{
description = "Espresso";
}
public double cost()
{
return 1.99;
}
}
public class HouseBlend extends Beverage{
public HouseBlend()
{
description = "HouseBlend";
}
public double cost()
{
return 0.89;
}
}
public class Mocha extends CondimentDecorator{
Beverage beverage;
public Mocha(Beverage beverage)
{
this.beverage = beverage;
}
public String getDescription()
{
return beverage.getDescription() + ", Mocha";
}
public double cost()
{
return .2 + beverage.cost();
}
}
public class StarbuzzCoffee {
public static void main(String[] args)
{
Beverage beverage = new Espresso();
System.out.println(beverage.getDescription()
+ " $" + beverage.cost());
Beverage beverage2 = new HouseBlend();
beverage2 = new Mocha(beverage2);
beverage2 = new Mocha(beverage2);
System.out.println(beverage2.getDescription()
+ " $" + beverage2.cost());
}
}
参考《设计模式》《Head First Design Patterns》
本文介绍装饰者模式,一种允许在不改变对象结构的前提下动态扩展其功能的设计模式。通过具体例子展示了如何使用装饰者模式来扩展对象的行为,同时遵循开放—关闭原则。
677

被折叠的 条评论
为什么被折叠?



