zoukankan      html  css  js  c++  java
  • [工作中的设计模式]装饰模式decorator

    一、模式解析

     装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。

    装饰模式的要点主要是:

    1、需要对已有对象扩展新的功能,又不希望改变原有对象接口;

    2、装饰者对象与原有对象需要继承相同接口,初始化装饰对象时将原有对象传入装饰对象;

    3、可以对一个对象定义多个装饰着对象,进行分别装饰或者组合装饰

    二、模式代码

    1、抽象接口

    package decorator.patten;
    
    public interface Component {
        public void operation();
    }

    2、定义被装饰对象

    package decorator.patten;
    
    public class ConcreteComponent implements Component {
    
        @Override
        public void operation() {
            System.out.println("我是被装饰对象,我执行了");
        }
    
    }

    3、定义装饰者对象A

    package decorator.patten;
    
    public class DecoratorA implements Component {
        Component component;
        public DecoratorA(Component component){
            this.component=component;
        }
        @Override
        public void operation() {
            System.out.println("我是装饰对象A,我在被装饰对象前增加打印");
            component.operation();
        }
    
    }

    4、定义装饰者对象B

    package decorator.patten;
    
    public class DecoratorB implements Component {
        Component component;
        public DecoratorB(Component component){
            this.component=component;
        }
        @Override
        public void operation() {
            component.operation();
            System.out.println("我是装饰对象b,我在被装饰对象后添加打印");
        }
    
    }

    5、定义客户端

    public class Client {
        public static void main(String[] args) {
            Component component=new DecoratorB(new DecoratorA(new ConcreteComponent()));
            component.operation();
        }
    }

    6、执行结果

    我是装饰对象A,我在被装饰对象前增加打印
    我是被装饰对象,我执行了
    我是装饰对象b,我在被装饰对象后添加打印

    三、说明

    1、装饰着模式可以为被装饰者添加新的功能,,将核心功能和装饰功能进行分离,比如日志打印,字符集处理等
    2、可以对对象进行多此装饰,装饰均会被执行
    3、示例中多次装饰没有顺序,但实际中往往会是有序的,比如数据加密和数据过滤,如果先加密再过滤就会出现问题
    4、装饰对象和被装饰对象均集成同一个接口,有时候为了简化,我们会将装饰对象直接集成被装饰对象,这就是子类重写父类方法达到扩展功能的
    四、应用场景

    装饰模式最典型的应用就是java IO中对inputstream和outputstream的装饰,例如

    dis = new DataInputStream(
                        new BufferedInputStream(
                                new FileInputStream("test.txt")
                        )
                );
  • 相关阅读:
    Windows Service开发介绍
    解决Vuex持久化插件-在F5刷新页面后数据不见的问题
    selenium+python 安装使用
    字符串拆分姓名、电话、省市区逻辑
    常用正则表达式大全——包括校验数字、字符、特殊密码过滤
    uni-app 地图初用 map
    前端常见手写笔试题
    数组去重和排序
    js获取当前时间年份,处理年月日
    js循环匹配组合成新对象或js循环组合新数据
  • 原文地址:https://www.cnblogs.com/jyyzzjl/p/5194023.html
Copyright © 2011-2022 走看看