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")
                        )
                );
  • 相关阅读:
    记录k8s:k8s1.8.4无坑离线安装
    Aspose.Words 16.8 破解版、添加自定义HTML导出Jpeg压缩质量配置
    Mint linux 自定义上下文菜单实现ZIP压缩文件无乱码解压
    Mint Linux 安装 DotnetCore 遭遇无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系
    微信多开技巧
    Pycharm5注册方式
    控制Linux下 mono 服务的启动停止
    Cesium 源码笔记[2] CesiumWidget模块的实例化过程 ver1.67
    Cesium 源码打包入门 [ver1.69]
    Cesium 源码笔记[1] Viewer模块实例化的大致过程 ver1.67
  • 原文地址:https://www.cnblogs.com/jyyzzjl/p/5194023.html
Copyright © 2011-2022 走看看