博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[工作中的设计模式]装饰模式decorator
阅读量:5243 次
发布时间:2019-06-14

本文共 1816 字,大约阅读时间需要 6 分钟。

一、模式解析

 装饰模式又名包装(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")                    )            );

 

转载于:https://www.cnblogs.com/jyyzzjl/p/5194023.html

你可能感兴趣的文章
(String)、toString、String.valueOf
查看>>
mongodb命令----批量更改文档字段名
查看>>
python多线程下载网页图片并保存至特定目录
查看>>
了解循环队列的实现
查看>>
CentOS 简单命令
查看>>
Linux中修改docker镜像源及安装docker
查看>>
javascript中强制类型转换
查看>>
python学习笔记
查看>>
php+ajax(jquery)的文件异步上传
查看>>
使用 SharedPreferences 分类: Andro...
查看>>
TLA+(待续...)
查看>>
python selenium 基本常用操作
查看>>
题解: [GXOI/GZOI2019]与或和
查看>>
Eurekalog
查看>>
LeetCode--169--求众数
查看>>
Copy 函数
查看>>
Android服务之Service(其一)
查看>>
网站sqlserver提权操作
查看>>
PHP变量作用域以及地址引用问题
查看>>
实验四
查看>>