博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【设计模式】装饰者模式
阅读量:5970 次
发布时间:2019-06-19

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

参考链接:http://www.cnblogs.com/mengdd/archive/2013/02/12/2910302.html

装饰者模式(Decorator):

  装饰者模式又称为包装模式。

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

  装饰模式通过创建一个包装对象,也就是装饰来包裹真实的对象。

  装饰模式以对客户端透明的方式动态地给一个对象附加更多的责任。

  装饰模式可以在不创建更多子类的情况下,对对象的功能加以扩展。是替代继承扩展功能的一个方案。

  装饰模式把客户端的调用委派到被装饰类。装饰模式的关键在于这种扩展是完全透明的。

装饰模式的角色:

  抽象构建角色(Component):给出一个抽象接口,以规范准备接受附加责任的对象。

  具体构建角色(Concreate Component):定义将要接受附加责任的类。

  装饰角色(Decorator):持有一个构建对象的引用,并定义一个与抽象构建接口一致的接口。

  具体装饰角色(Concreate Decorator):负责给构建对象贴上 附加的责任。

JAVA IO中的装饰模式:

  在IO中,具体构建角色是节点流,装饰角色是过滤流。过滤流担任了过滤文件的角色。

  FilterInputStream和FilterOutputStream是装饰角色,其派生自他们的类则是具体装饰角色。

装饰模式的特点:

  装饰对象和真实对象有相同的接口,这样客户端对象就可以和真实对象以相同的方式和装饰对象进行交互。

  装饰对象包含一个真实对象的引用。

  装饰对象接口所有来自客户端的请求,它把这些请求转发给真实的对象。

  装饰对象可以转发这些请求后附加一些功能。

程序实例:  

  1. 抽象构建角色:

/** * 抽象构件角色,以规范准备接受附加责任的对象 * @author rding * */public interface Component {    void doSomething();}

  2.具体构建角色:

/** * 具体构件角色,要接受附加责任的类 * @author rding */public class ConcreteComponent implements Component{    @Override    public void doSomething() {        System.out.println("功能A");    }}

  3. 装饰角色:持有一个构建对象角色的引用

/** * 装饰角色 * @author rding * */public class Decorator implements Component{        private Component component;        public Decorator(Component component) {        super();        this.component = component;    }    @Override    public void doSomething() {        component.doSomething();    }}

  4.具体装饰角色1

/** * 具体装饰角色1 * @author rding */public class ConcreteDecorator1 extends Decorator {    public ConcreteDecorator1(Component component) {        super(component);    }    @Override    public void doSomething() {        super.doSomething();        doAnotherThing();    }    private void doAnotherThing() {        System.out.println("功能B");    }}

  具体装饰角色2:

/** * 具体装饰角色2 * @author rding */public class ConcreteDecorator2 extends Decorator{    public ConcreteDecorator2(Component component) {        super(component);    }    @Override    public void doSomething() {        super.doSomething();        this.doAnthing();    }    private void doAnthing() {        System.out.println("功能C");    }}

   5.客户端调用:

public class Client {    public static void main(String[] args) {        Component component = new ConcreteComponent();        Component component1 = new ConcreteDecorator1(component);        component1.doSomething();        System.out.println("----------------------");                Component component2 = new ConcreteDecorator2(component1);        component2.doSomething();    }    }

  结果:

功能A功能B----------------------功能A功能B功能C

 

转载于:https://www.cnblogs.com/lfdingye/p/7357667.html

你可能感兴趣的文章
小程序不同页面之间通讯的解决方案
查看>>
htmltest~计算器界面的实现
查看>>
美团前端一面
查看>>
JS函数式编程概念理解:函子(Functor)
查看>>
React官方文档学习笔记(二)
查看>>
城市列表选择页面
查看>>
Android分享-微信、Facebook、Google
查看>>
深入理解 Git
查看>>
<<从0到1学C++>> 第3篇 从结构到类的演变
查看>>
Java高级工程师必备数据结构算法高效查找算法原理分析与实现
查看>>
【java+selenium】网易云音乐刷累计听歌数
查看>>
Android进阶:六、在子线程中直接使用 Toast 及其原理
查看>>
Java输出数组中最长递增子序列的代码
查看>>
vue中v-model是个啥?
查看>>
LeetCode 之 JavaScript 解答第23题 —— 合并K个有序链表(Merge K Sorted Lists)
查看>>
基于Fixed定位的框选功能
查看>>
狂潮微课表示-怎么做免费的百度爱采购推广
查看>>
函数调用的预编译
查看>>
深入理解DOM事件机制
查看>>
比高房价更可怕的是,35岁以后你还能干嘛?这是我看过的最棒建议
查看>>