装饰模式将类的装饰功能从类中分离出来,只保留了类的核心职责,装饰逻辑(顺序)由调用者选择分配。
/** * Created by hero on 16-3-30. */ public abstract class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Person() { } public Person(String name) { this.name = name; } public abstract void show(); } /** * Created by hero on 16-3-30. */ public class Finery extends Person { protected Person person; public void Decorate(Person person) { this.person = person; } @Override public void show() { if (this.person != null) { person.show(); } } } /** * Created by hero on 16-3-30. */ public class TShirt extends Finery { public void show() { super.show(); System.out.println("T-shirt"); } } /** * Created by hero on 16-3-30. */ public class Trouser extends Finery { public void show() { super.show(); System.out.println("Trouser"); } } /** * Created by hero on 16-3-30. */ public class ConcretePerson extends Person { public ConcretePerson(String name) { setName(name); } @Override public void show() { System.out.println(getName()); } } public class Main { public static void main(String[] args) { ConcretePerson person = new ConcretePerson("小明"); TShirt tShirt = new TShirt(); Trouser trouser = new Trouser(); tShirt.Decorate(person); trouser.Decorate(tShirt); trouser.show(); } }