美文网首页
设计模式整理(11) 装饰模式

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

作者: 安静的蓝孩子 | 来源:发表于2019-02-21 11:32 被阅读0次

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

    介绍

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

    定义

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

    使用场景

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

    结构

    装饰模式 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) 装饰模式

          本文链接:https://www.haomeiwen.com/subject/abhryqtx.html