学习设计模式2装饰模式

装饰模式结构

装饰模式是为了在已有的功能上添加额外的功能的一种方式,对已经有的方法再进行装饰

应用场景:当需求是需要向系统中,旧代码中添加新的代码时使用,比如以前的代码是发送一个接口请求,这个时候你需要为其进行加密,或则进行敏感词过滤,我们最直接的思维就是直接修改代码,但是这个时候可以使用装饰模式,对之前的旧的方法(就一个请求)进行装饰。这样就不会修改原来的代码。但是最好是使用装饰的时候,是独立的模块,不会因为顺序而影响的模块。

  • 抽象的对象

    package 结构;
    
    /**
     * @Program: 设计模式
     * @Description: 对象接口,可以为其动态的添加一些功能
     * @Author Mokairui
     * @Date 2020/12/2 20:12
     */
    public interface Component {
    
        /**
         * 一个接口方法功能
         */
        void operation();
    
    }
    
    
  • 具体的对象

    package 结构;
    
    /**
     * @Program: 设计模式
     * @Description: 一个具体的对象,可以为这个具体的对象添加具体的操作
     * @Author Mokairui
     * @Date 2020/12/2 20:20
     */
    public class CreateComponent implements Component {
        @Override
        public void operation() {
            System.out.println("具体对象的操作");
        }
    }
    
    
  • 装饰对象

    package 结构;
    
    /**
     * @Program: 设计模式
     * @Description: 实现Component类,从外部扩展Component的功能
     * @Author Mokairui
     * @Date 2020/12/2 20:21
     */
    public abstract class Decorator implements Component {
    
        protected Component component;
    
        public void setComponent(Component component) {
            this.component = component;
        }
    
        @Override
        public void operation() {
            if (null != component) {
                component.operation();
            }
        }
    }
    
    
  • 具体的装饰对象

    package 结构;
    
    /**
     * @Program: 设计模式
     * @Description: 具体的装饰对象,起到给Component添加职责的功能
     * @Author Mokairui
     * @Date 2020/12/2 20:33
     */
    public class CreateDecorateA extends Decorator {
        // 用户区别装饰对象B
        private String addState;
    
        @Override
        public void operation() {
            super.operation();
            addState = "New State";
            System.out.println("具体装饰对象A的操作");
        }
    }
    
    
    package 结构;
    
    /**
     * @Program: 设计模式
     * @Description: 具体的装饰对象,起到给Component添加职责的功能
     * @Author Mokairui
     * @Date 2020/12/2 20:34
     */
    public class CreateDecoratorB extends Decorator {
    
        @Override
        public void operation() {
            super.operation();
            test();
            System.out.println("具体装饰对象B的操作");
        }
    
        // 用于区别装饰对象A
        public void test() {
    
        }
    
    }
    
    

装饰模式例子

在结构类图和例子的类图中显示,其实要使用时创建的对象只有两类,一类有具体实现功能方法的类(以前的旧方法),第二类就是具体的装饰类。而后装饰类里面有个装饰方法(在上面例子结构中就是Decorate方法),然后用具体的装饰对象调用装饰方法,参数就是需要装饰的实体对象。

  • Person类

    package example;
    
    /**
     * @Program: 设计模式
     * @Description: 结构中的CreateComponent类
     * @Author Mokairui
     * @Date 2020/12/3 19:02
     */
    public class Person {
    
        private String name;
    
        public Person() {
        }
    
        public Person(String name) {
            this.name = name;
        }
    
        public void show() {
            System.out.println("装扮衣服的" + name);
        }
    }
    
    
  • Finery服饰类,也就是装饰类

    package example;
    
    /**
     * @Program: 设计模式
     * @Description: 服饰类
     * @Author Mokairui
     * @Date 2020/12/3 19:07
     */
    public class Finery extends Person {
    
        protected Person component;
    
        // 装饰
        public void Decorate(Person component) {
            this.component = component;
        }
    
        @Override
        public void show() {
            if (null != component) {
                component.show();
            }
        }
    }
    
    
  • 具体的装饰对象

    package example;
    
    /**
     * @Program: 设计模式
     * @Description: 具体的服饰类
     * @Author Mokairui
     * @Date 2020/12/3 19:24
     */
    public class TShirts extends Finery {
    
        @Override
        public void show() {
            System.out.print("大T恤");
            super.show();
        }
    }
    
    
    package example;
    
    /**
     * @Program: 设计模式
     * @Description: 具体的服饰类,装饰类
     * @Author Mokairui
     * @Date 2020/12/3 19:27
     */
    public class BigTrouser extends Finery {
        @Override
        public void show() {
            System.out.print("打跨裤");
            super.show();
        }
    }
    
    
  • 测试

    package example;
    
    /**
     * @Program: 设计模式
     * @Description: 测试类
     * @Author Mokairui
     * @Date 2020/12/3 19:28
     */
    public class Demo {
    
        public static void main(String[] args) {
            Person person = new Person("马儿扎哈");
    
            TShirts ts = new TShirts();
            BigTrouser bt = new BigTrouser();
    
            ts.Decorate(person);
            ts.show();
            System.out.println("------------------");
            bt.Decorate(person);
            bt.show();
            System.out.println("-------------------");
            ts.Decorate(person);
            bt.Decorate(ts);
            bt.show();
    
        }
    
    }
    
    

在结构类图和例子的类图中显示,其实要使用时创建的对象只有两类,一类有具体实现功能方法的类(以前的旧方法),第二类就是具体的装饰类。而后装饰类里面有个装饰方法(在上面例子结构中就是Decorate方法),然后用具体的装饰对象调用装饰方法,参数就是需要装饰的实体对象。

posted on 2020-12-03 19:54  莫铠瑞  阅读(41)  评论(0)    收藏  举报