首页 > 其他 > 详细

学习设计模式2--装饰模式

时间:2020-12-03 21:59:51      阅读:34      评论:0      收藏:0      [点我收藏+]

学习设计模式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方法),然后用具体的装饰对象调用装饰方法,参数就是需要装饰的实体对象。

学习设计模式2--装饰模式

原文:https://www.cnblogs.com/mokairui/p/14076833.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!