1.定义
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式生成子类更为灵活。
2.使用场景
需要透明且动态拓展类的功能。
3.简单实现
以人穿不同的衣服的行为为例子
//定义一个人抽象类 abstract class Person{ //穿衣 abstract void dressed(); } //具体的人 被装饰的对象 class Boy extends Person{ @Override void dressed() { System.out.println("穿了内衣内裤"); } } //抽象出一个装饰者来表示衣服 abstract class PersonCloth extends Person{ protected Person mPerson; //保持一个引用 public PersonCloth(Person mPerson) { this.mPerson = mPerson; } @Override void dressed() { mPerson.dressed(); } } //高档衣服 class ExpensiveCloth extends PersonCloth{ public ExpensiveCloth(Person mPerson) { super(mPerson); } private void dressShirt(){ System.out.println("穿短袖"); } private void dressLeather(){ System.out.println("穿件皮衣"); } private void dressJean(){ System.out.println("穿牛仔裤"); } @Override void dressed() { super.dressed(); dressShirt(); dressLeather(); dressJean(); } } //便宜衣服 class CheapCloth extends PersonCloth{ public CheapCloth(Person mPerson) { super(mPerson); } private void dressShorts(){ System.out.println("穿个草裙"); } @Override void dressed() { super.dressed(); dressShorts(); } } public class Decorator { public static void main(String[] args){ Person boy = new Boy(); //穿上便宜的衣服 CheapCloth cheapCloth = new CheapCloth(boy); cheapCloth.dressed(); System.out.println("--------换身衣服----------"); //穿上高档衣服 ExpensiveCloth expensiveCloth = new ExpensiveCloth(boy); expensiveCloth.dressed(); } }
输出:
4.小结
装饰模式和代理模式优点类似,装饰模式是对客户端透明的方式拓展对象的功能,是继承关系的一个代替方案,代理模式则是给一个对象提供一个代理,并有代理对象来控制原有对象的引用。