• 对象结构型


    介绍

    * 装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能
    * 它是通过创建一个包装对象,也就是装饰来包裹真实的对象
    

    优点

    * 可以为已有功能动态地添加上其他新功能
    * 比继承更多的灵活性
    * 把类中的装饰功能从类中移除出去,让类简化,是类的核心逻辑和装饰功能分开
    * 通过使用不同的 具体装饰类 以及这些装饰类的[排列组合],设计师可以创造出很多 [不同行为的组合]
    

    缺点

    * 装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂
    * 装饰模式是针对抽象组件(Component)类型编程。但是,如果你要针对具体组件编程时,就应该重新思考你的应用架构,以及装饰者是否合适
    

    使用场景

    以下情况使用Decorator模式
    * 需要扩展一个类的功能,或给一个类添加附加职责
    * 需要动态的给一个对象添加功能,这些功能可以再动态的撤销
    * 当不能采用生成子类的方法进行扩充时
    	1. 一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长
    	2. 另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
    

    参考(https://baike.baidu.com/item/装饰模式/10158540?fr=aladdin)

    入门案例:

    UML图解:

    代码:

    [Component]

    person:

    public interface Person {
        void doSomething(); //做些事情
    }
    

    [ConcreteComponent ]

    Man:

    public class Man implements Person {
    
        private void eat(){
            System.out.println("吃饭");
        }
    
        @Override
        public void doSomething() {
            eat();
        }
    
    }
    

    [Decorator]

    Decorator:

    //一个装饰器抽象类
    public abstract class Decorator implements Person {
    
        protected Person person;
    
        public Decorator(Person person){
            this.person = person;
        }
    
        @Override
        public void doSomething() {
            if (person != null)
                person.doSomething();
        }
    }
    

    [ConcreteDecorator]

    WatchTV_Decorator:

    public class WatchTV_Decorator extends Decorator {
    
        public WatchTV_Decorator(Person person) {
            super(person);
        }
    
        @Override
        public void doSomething() {
            System.out.println("看电视");
            super.doSomething();
        }
    }
    

    Somke_Decorator

    public class Smoke_Decorator extends WatchTV_Decorator {
    
        public Smoke_Decorator(Person person) {
            super(person);
        }
    
        @Override
        public void doSomething() {
            super.doSomething();
            System.out.println("抽烟");
        }
    }
    

    测试:

    public class Main {
    
        public static void main(String[] args){
    
            Person man = new Man();
    
            //情况1:这个男人想做什么呢
    //        man.doSomething();
            /**
             *  output:
             *      吃饭
             */
    
    
            //情况2:这个男人想在吃饭前看看电视
    //        Decorator watchTV_decorator = new WatchTV_Decorator(man);
    //        watchTV_decorator.doSomething();
            /**
             *  output:
             *      看电视
             *      吃饭
             */
    
    
            //情况3:这个男人想在吃饭前看看电视切吃完饭还想抽烟
            Decorator smoke_decorator = new Smoke_Decorator(man);
            smoke_decorator.doSomething();
            /**
             *  output:
             *      看电视
             *      吃饭
             *      抽烟
             */
    
        }
    }
    
  • 相关阅读:
    Android MVP框架实现过程
    bga-banner-引导页滑动第三方控件
    好的习惯是成功的一半之开发
    Java基础复习之String字符串format处理
    ButterKnife--View注入框架的使用
    div阴影
    JavaScript函数的4种调用方法详解
    JavaScript的三种对话框是通过调用window对象的三个方法alert(),confirm()和prompt()
    HTML文字闪烁
    HTML文本框样式大全
  • 原文地址:https://www.cnblogs.com/tandi19960505/p/8160524.html
Copyright © 2020-2023  润新知