在已有的功能上边需要动态的添加新的功能。
在装饰器模式中通常用以下的几类对象: 抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象 具体构件角色(Employe):定义一个将要接收附加责任的类 装饰角色(Manager):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口 具体装饰角色(ManagerA,ManagerB):负责给构件对象“贴上”附加的责任 具体的UML示意图如下:
下面我们通过一个人不断学习技能的例子来对装饰模式进行一个讲解: 首先,我们定义一个Human接口:
public interface Human { void move(); }随后我们编写一个Man类-也就是那个需要被加强的类:
public class Man implements Human { @Override public void move() { System.out.println("直立行走"); } }接下来定义SuperMan类,基于此类,我们会不断派生出新的类。
public class Superman implements Human { private Human human; public Superman(Human human) { this.human = human; } @Override public void move() { human.move(); } }
例:
public class DoctorS extends Superman { public DoctorS(Human human) { super(human); } public void magic(){ System.out.println("魔法"); } @Override public void move() { super.move(); magic(); } }
其他的例子这里限于篇幅进行适当的省略。 最后是我们的测试类
public class Client { public static void main(String[] args) { Man man=new Man();//需要被加强的对象 man.move(); System.out.println("增加钢铁侠的技能"); Ironman ironman =new Ironman(man); ironman.move(); System.out.println("增加奇异博士的技能"); DoctorS doctorS=new DoctorS(ironman); doctorS.move(); System.out.println("增加蚁人的技能"); AntMan antMan=new AntMan(doctorS); antMan.move(); } }
装饰模式主要是用来解决编程中使用继承,所导致的类”膨胀”问题,在本例中,我们可以看到桥接模式和前面的装饰模式有着比较类似的目的,但实际上它们是完全不同的。因为两者的诱因不一样。桥接模式是对象自身现有的机制沿着多维度的变化,既有部分不稳定。而装饰模式则是为了增加新的功能。
代码链接: https://github.com/memoryexplosion/design_pattern_review/tree/master/src/java/decorator
