zoukankan      html  css  js  c++  java
  • 对象结构型

    介绍

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

    优点

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

    缺点

    * 装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂
    * 装饰模式是针对抽象组件(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:
             *      看电视
             *      吃饭
             *      抽烟
             */
    
        }
    }
    
  • 相关阅读:
    linux中上传文件出现Refused to display 'http://***' in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'.
    1 js中常用的操作
    1 走进并行世界
    18 java I/O 系统
    Spring项目中的数据库加密
    13/14:字符串与类型信息
    使用HttpClient访问接口(Rest接口和普通接口)
    java 队列的使用(转载)
    java锁有哪些类(转)
    J2EE,J2SE,J2ME,JDK,SDK,JRE,JVM区别(转载)
  • 原文地址:https://www.cnblogs.com/tandi19960505/p/8160524.html
Copyright © 2011-2022 走看看