装饰者模式
装饰者模式:动态地给现有的类添加新功能;既然是装饰者,那么意味着,这些功能是可以随时添加,也可以随时拆卸,正如人穿衣服,多穿一件衣服与少穿一件衣服,并不会影响人本身一样。
现在有一个Person:
package com.lin.Decorator; public class Person { private String name; public Person() {} public Person(String name) { this.name = name; } //显示装扮 public void show(){ System.out.println("装扮的"+name); } public String getName() { return name; } public void setName(String name) { this.name = name; } }
为了给这个person增加装饰:我们需要一个个装饰类,由于没有接口,我们选择用继承的方式,创建一个装饰类:
package com.lin.Decorator; /** * * 装饰类(所有装饰都继承此类) * @author lin * */ public class Decorator extends Person { protected Person person; //装扮 public void decorate(Person person) { this.person = person; } @Override public void show() { // TODO 重写父类的show方法 if(person != null) { person.show(); } } }
接下来,我们便可以以装饰类为模板,创建各种各样的具体的装饰了,如衣服,裤子,鞋子等:
package com.lin.Decorator; /** * TShirt 装扮 * @author lin * */ public class TShirt extends Decorator { @Override public void show() { // TODO 重写父类show方法,增加新功能,穿TShirt System.out.print("大TShirt "); super.show(); } }
package com.lin.Decorator; /** * TShirt 装扮 * @author lin * */ public class TShirt extends Decorator { @Override public void show() { // TODO 重写父类show方法,增加新功能,穿TShirt System.out.print("大TShirt "); super.show(); } }
package com.lin.Decorator; /** * TShirt 装扮 * @author lin * */ public class Trouser extends Decorator { @Override public void show() { // TODO 重写父类show方法,增加新功能,穿裤子 System.out.print("裤子 "); super.show(); } }
最后,我们开始进行组装:
package com.lin.Decorator; public class AddDecorator { public static void main(String[] args) { // TODO 给人装饰 Person person = new Person("张三"); //穿球鞋 Sneker sneker = new Sneker(); sneker.decorate(person); //穿TShirt TShirt tShirt = new TShirt(); tShirt.decorate(sneker); //穿裤子 Trouser trouser = new Trouser(); trouser.decorate(tShirt); trouser.show(); } }
结果:

我们可以发现:这一条流程下来,我们没有改变person,但却增加了新东西,甚至,这些装饰可以调换位置,随时拆卸与增加。
装饰者模式,适合对已经存在的类进行功能性的扩展,当然,如果有接口,那么用接口实现会更好。
浙公网安备 33010602011771号