装饰模式定义:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
装饰模式的初步理解:装饰是对某一个实体进行装饰,装饰的饰品根据装饰的对象不同而不同。对于同一个实体,装饰的顺序也有可能不同。因此就需要就实体而言进行装饰。而装饰品的功能都一样,就是用来修饰实体。因此,所有的装饰品可以继承同一个类;但是为了避免将这些实现类对象的引用放到实体类中(破坏开闭原则,添加新饰品和删除饰品都要修改实体类),将所有的装饰类对象串成一条链。实体类只管调用第一个饰品,后面的自动向下调用即可,直到结束。或者先调用饰品的方法,最后一个饰品调用实体的方法。
code…
实体和饰品统一个接口,这样的优点是暴露给客户端的就一个方法
public interface Component {
public void operation();
}
装饰类的父类:
public class Decorator implements Component {
private Component component;
public Decorator(Component component) {
this.component = component;//连接下一个饰品
}
public void operation()
{
if(component!=null)
component.operation();//调用下一个饰品的方法
}
}
饰品类(有多个,但结构都类似):执行自己
的和调用下一个
之间的顺序可以根据需求进行调换。
public class DecorateA extends Decorator {
public DecorateA(Component component) {
super(component);
}
@Override public void operation() {
super.operation();//先调用下一个的方法
System.out.println("这是装饰品A");//执行自己的方法。
}
}
实体类,也就是要被修饰的最后接到链中:
public class ConcreteOperation implements Component {
@Override public void operation() {
System.out.println("这里是主产品");
}
}
main方法:
public class Main {
public static void main(String[] args) {
Component con=new ConcreteOperation();//实体
Component da=new DecorateA(con);//装饰,挂链
Component db=new DecorateB(da);
Component dc=new DecorateC(db);
dc.operation();
}
}
执行的时候,先向下执行,直到实体的被执行,然后回溯到装饰,执行装饰。类似于逆向输出一个单向链表。
装饰着模式总结:在某些特定情况下增加实体类的功能时,如果不用装饰者模式,就需要对实体添加字段,修改代码。但是在大多数情况下增加的这些功能也许都不会用。因此,没有必要修改代码。将要装饰的功能单独放在类中,并让这个类包装它所要修饰的对象。再需要时进行动态添加就可以了。
上一篇 |
---The End---
| 下一篇 |