文档章节

【结构型】- 装饰器模式

ZeroneLove
 ZeroneLove
发布于 02/19 22:31
字数 711
阅读 7
收藏 0

装饰器设计模式


装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构,作为现有类的包装。

角色


  • Component:组件对象接口,可给对象动态的添加职责;

  • ConcreteComponent:具体组件对象,实现组件接口,该对象通常就是被装饰器装饰的原始对象,可给这个对象添加职责;

  • Decorator:所有装饰器父类,需定义1个与组件接口一致的接口,主要是为了实现装饰器功能复用,即具体的装饰器A可装饰另外一个具体的装饰器B,因装饰器类也是一个Component),并持有一个Component对象,该对象其实也是被装饰的对象。如果不继承组件接口类,则只能为某个组件添加单一的功能,即装饰器对象不能在装饰其他的装饰器对象。

  • ConcreteDecorator:具体装饰器类,实现具体要向被装饰对象添加的功能,用来装饰具体的组件对象或者另外1个具体的装饰器对象。


Component角色:被装饰对象

public interface Phone {
	public void call();
}

ConcreteComponent角色:

public class PhoneImp implements Phone {

	@Override
	public void call() {
        System.out.println("手机正在通话.......");
	}
}

Decorator 角色:装饰器:通过接口持有被装饰对象的引用,作为装饰器的基类

public abstract class PhoneDecorate implements Phone {

    private Phone phone;

    public  PhoneDecorate(Phone phone) {
        this.phone = phone;
    }

    @Override
    public void call() {
        this.phone.call();
    }
}

ConcreteDecorator角色:

public class ColorPhoneDecorate extends PhoneDecorate{

    //Phone可是其他的Phone接口的子类,也可是特殊功能
    public ColorPhoneDecorate(Phone phone) {
        super(phone);
    }

    @Override
    public void call(){
        System.out.println("手机正在播放彩铃.....");
        super.call();
    }
}
public class GuangGaoPhoneDecorate extends PhoneDecorate{

    public GuangGaoPhoneDecorate(Phone phone) {
        super(phone);
    }

    @Override
    public void call(){
        super.call(); //调用被包装对象的方法
        System.out.println("手机语音正在播放广告......");
    }
}

测试代码:

//手机彩铃功能:1层装饰
Phone phone = new PhoneImp();  //基础接口实现类
PhoneDecorate phoneDecorate = new ColorPhoneDecorate(phone); //抽象装饰类
phoneDecorate.call();

System.out.println("-----------------------");

//手机的彩铃和广告功能:2层装饰
phoneDecorate = new GuangGaoPhoneDecorate(new ColorPhoneDecorate(phone));
phoneDecorate.call();

手机功能演变:基础通话功能 --> 基础通话+彩铃 -->基础通话+彩铃+广告语音


装饰器模式分析:

装饰器和组件类都实现相同的接口,可将他们理解为一组和接口关联的对象,装饰器持有组件对象的引用,可保证各种实现基础组件接口的装饰器可以互相组合,从而实现不同的功能。

经典应用:JDK的IO流

© 著作权归作者所有

ZeroneLove
粉丝 4
博文 162
码字总数 128572
作品 0
深圳
高级程序员
私信 提问
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.1K
69
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
2018/11/06
0
0
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu
2017/11/02
0
0
《JavaScript设计模式与开发实践》原则篇(2)—— 最少知识原则

最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这 里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。 单一职责原则指导我们...

嗨呀豆豆呢
2018/12/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

springmvc的return “success”源码解读

qqqq

architect刘源源
今天
4
0
Java程序员五面阿里分享 逆袭成功 太不容易了!

前言 拿到阿里实习offer,经历了5次面试,其中4轮技术面,1轮HR面试。在这里分享一下自己的面试经验和学习心得。希望能够帮助更多的小伙伴。 我本科毕业于中南大学信管专业,真正开始学习Jav...

别打我会飞
昨天
4
0
Android Camera模块解析之视频录制

《Android Camera架构》 《Android Camera进程间通信类总结》 《Android Camera模块解析之拍照》 《Android Camera模块解析之视频录制》 《Android Camera原理之CameraDeviceCallbacks回调模...

天王盖地虎626
昨天
2
0
手把手教你使用issue作为博客评论系统

自从上周在阮一峰的 每周分享第 60 期 看到了可以将 GitHub 的 issue 当作评论系统,插入第三方网页的 JS 库——utterances。我就对此“魂牵梦绕”。个人博客使用的是VuePress。 TLDR (不多废...

jump--jump
昨天
9
0
商业合作模式有几种

公司合作首先要看公司的发展、定位已经公司双方的实力,前期沟通,了解很重要,切不可盲目。一般公司之间合作有以下: 一、六种合作模式 1、资源互换:资源互换是一种双方商定在一段时间内彼此...

吴伟祥
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部