设计模式整理(11) 装饰模式

学习《Android 源码设计模式解析与实践》系列笔记

介绍

装饰模式,也称包装模式,结构型设计模式之一。

定义

动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。

使用场景

需要透明且动态地扩展类的功能时。

结构

设计模式整理(11) 装饰模式_第1张图片
装饰模式 UML 图
  • Component : 抽象组件。接口或抽象类,被装饰的原始对象。
  • ConcreteComponent : 组件具体实现类。
  • Decorator : 抽象装饰者,内部需要有一个组件对象的引用。
  • ConcreteDecorator : 具体的装饰者类。

实现

人穿衣服,衣服为装饰。

/**
 * 人的抽象,对应抽象的Component
 */
public abstract class Person {
    public abstract void dressed();
}
/**
 * 人的具体实现类,男孩,对应 ConcreteComponent 角色
 */
public class Boy extends Person {
    @Override
    public void dressed() {
        System.out.println("穿上底裤");
    }
}
/**
 * 装饰抽象类,对应 Decorator 角色
 */
public class PersonCloth extends Person {

    private Person mPerson;

    public PersonCloth(Person person) {
        mPerson = person;
    }

    @Override
    public void dressed() {
        mPerson.dressed();
    }
}
/**
 * 具体装饰实现类,便宜装扮
 */
public class CheapCloth extends PersonCloth {

    public CheapCloth(Person person) {
        super(person);
    }

    public void dressShorts() {
        System.out.println("穿条短裤");
    }

    @Override
    public void dressed() {
        super.dressed();
        dressShorts();
    }
}
/**
 * 具体装饰实现类,豪华装扮
 */
public class ExpensiveCloth extends PersonCloth {

    public ExpensiveCloth(Person person) {
        super(person);
    }

    private void dressShirt() {
        System.out.println("穿件短袖");
    }

    private void dressLeather() {
        System.out.println("穿件皮衣");
    }

    private void dressJean() {
        System.out.println("穿件牛仔裤");
    }

    @Override
    public void dressed() {
        super.dressed();
        dressShirt();
        dressLeather();
        dressJean();
    }
}
public class Client {

    public static void main(String args[]) {
        Person boy = new Boy();

        PersonCloth clothCheap = new CheapCloth(boy);
        clothCheap.dressed();

        PersonCloth clothExpensive = new ExpensiveCloth(boy);
        clothExpensive.dressed();
    }

}

总结

Android 源码中,ContextContextImpl 的实现就是使用了装饰模式。

装饰模式是对客户端透明的方式扩展对象的功能,是继承方式的一个替代方案。



相关文章:

设计模式整理(1) 代理模式
设计模式整理(2) 单例模式
设计模式整理(3) Builder 模式
设计模式整理(4) 原型模式
设计模式整理(5) 工厂模式
设计模式整理(6) 策略模式
设计模式整理(7) 状态模式
设计模式整理(8) 责任链模式
设计模式整理(9) 观察者模式
设计模式整理(10) 适配器模式
设计模式整理(11) 装饰模式
设计模式整理(12) 中介者模式

你可能感兴趣的:(设计模式整理(11) 装饰模式)