设计模式(四):装饰模式
一、概念
装饰模式又被称为包装模式。通过对客户端透明的方式来拓展对象的功能,是继承关系的一种替代方案
二、实现
假设,现在要给QQ秀里的人物设计装扮衣服,每个人可按自己不同的喜好搭配不同的衣服。
-
先创建Person类,它里面有一个show()展示(也是穿衣服)的方法
public class Person { private String name; public Person() { } public Person(String name){ this.name=name; } //后面集成的子类都要覆盖该方法 public void show(){ System.out.println("装扮的"+name); } }
-
再创建一个FineryDecorator的装饰类,继承Person类
public class FineryDecorator extends Person { protected Person component;//关联Person,二者是聚合关系 public void decorate(Person component){ this.component=component; } @Override public void show(){ component.show(); } }
-
相继创建各种各样的衣服类,都继承与FineryDecorator装饰类
//T恤 public class TShirts extends FineryDecorator { @Override public void show(){ System.out.print("T恤 ");//关键代码,穿T恤 super.show(); } } //大垮裤 public class BigTrouser extends FineryDecorator { @Override public void show(){ System.out.print("大垮裤 ");//关键代码,大垮裤 super.show(); } } //后面的类,以此类推 /** .... */
-
检验成果,测试:
public static void main(String[] args) { Person p=new Person("Tom"); System.out.println("第一种装扮:"); TShirts tShirts=new TShirts(); Tie tie=new Tie(); Shoes shoes=new Shoes(); tShirts.decorate(p); tie.decorate(tShirts); shoes.decorate(tie); shoes.show(); System.out.println("第二种装扮:"); Suit suit=new Suit(); BigTrouser bigTrouser=new BigTrouser(); Shoes shoes1=new Shoes(); suit.decorate(p); bigTrouser.decorate(suit); shoes1.decorate(bigTrouser); shoes1.show(); }
运行截图:
三、总结
装饰者模式可以动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
装饰者和被装饰者之间必须是一样的类型,也就是要有共同的超类。在这里应用继承并不是实现方法的复制,而是实现类型的匹配。因为装饰者和被装饰者是同一个类型,因此装饰者可以取代被装饰者,这样就使被装饰者拥有了装饰者独有的行为。根据装饰者模式的理念,我们可以在任何时候,实现新的装饰者增加新的行为。如果是用继承,每当需要增加新的行为时,就要修改原程序了。