Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案。
意图:
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
设计原则:
1. 多用组合,少用继承。
利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。然而,如果能够利用组合的做法扩展对象的行为,就可以在运行时动态地进行扩展。
2. 类应设计的对扩展开放,对修改关闭。
上代码实例
public interface Order { public void print(); }
public class SalesOrder implements Order { public void print() { } }
public class OrderDecorator implements Order { protected Order order; public OrderDecorator(Order order) { this.order = order; } public void print() { System.out.println("Order"); } }
public class HeaderDecorator extends OrderDecorator { public HeaderDecorator(Order order) { super(order); } public void print() { printHeader(); super.order.print(); } public void printHeader() { System.out.println("Header"); } }
public class FooterDecorator extends OrderDecorator { public FooterDecorator(Order order) { super(order); } public void print() { super.order.print(); printFooter(); } public void printFooter() { System.out.println("Footer"); } }
public class Client { public static void main(String[] args) { Order order = new SalesOrder(); //本来是个销售订单 order = new OrderDecorator(order); //我们销售订单装饰一下,就可以打印比如发票订单详细 order = new FooterDecorator(order); //再装饰一下,就可以打印发票尾部 order = new HeaderDecorator(order); //再装饰一下,可以打印发票头部 order.print(); //就一个打印就可以打印所有内容了,神奇吧 哈哈 } }
打印结果
Header
Order
Footer
其实Java中的流操作就是使用的装饰模式