Decorator Pattern (装饰者模式)
装饰者模式( Decorator Pattern )
意图 : 动态的给一个对象添加一些额外的功能,IO这块内容体现出了装饰模式,Decorator模式相比生成子类更为灵活。
角色 :
1)抽象构件角色(Component)--- 定义成一个接口类型
2)具体构件角色 (ConcreteComponent) --- 该类(被装饰者)实现了 Component 接口,
3)装饰角色 (Decorator) --- 该类实现了 Component 接口,并持有 Component接口的引用
4)具体装饰角色 (ConcreteDecorator) --- 该类继承了装饰类
UML实现:
代码实现:
Component.java
- package com.decorator ;
- //抽象构件角色
- public interface Component
- {
- public void operation() ;
- }
ConcreteComponent.java
- package com.decorator ;
- //具体构件角色
- public class ConcreteComponent implements Component
- {
- public void operation()
- {
- System.out.println("实现功能A") ;
- }
- }
Decorator.java
- package com.decorator ;
- //装饰角色,持有一个构件角色的引用
- public class Decorator implements Component
- {
- Component component = null ;
- public Decorator(Component component)
- {
- this.component = component ;
- }
- public void operation()
- {
- this.component.operation() ;
- }
- }
ConcreteDecoratorA.java
- package com.decorator ;
- //具体装饰角色A
- public class ConcreteDecoratorA extends Decorator
- {
- public ConcreteDecoratorA(Component component)
- {
- super(component) ;
- }
- public void operation()
- {
- super.operation() ;
- System.out.println("实现功能B") ;
- }
- }
ConcreteDecoratorB.java
- package com.decorator ;
- //具体装饰角色B
- public class ConcreteDecoratorB extends Decorator
- {
- public ConcreteDecoratorB(Component component)
- {
- super(component) ;
- }
- public void operation()
- {
- super.operation() ;
- System.out.println("实现功能C") ;
- }
- }
Client.java
- package com.decorator ;
- public class Client
- {
- public static void main(String[] args)
- {
- //装饰者一般不用出现在客户端 , 因它内部自己会处理
- //ConcreteComponent cc = new ConcreteComponent() ;
- //ConcreteDecoratorA cd = new ConcreteDecoratorA(cc) ;
- //ConcreteDecoratorB cd2 = new ConcreteDecoratorB(cd) ;
- //cd2.operation() ;
- //上面的代码等价于下面的代码
- ConcreteDecoratorB cd = new ConcreteDecoratorB(new ConcreteDecoratorA(new ConcreteComponent())) ;
- cd.operation() ;
- }
- }
小结:
装饰者和被装饰者拥有共同的接口;
装饰者一般不用客户端去调用 , 因它内部自己会处理;
可以用一个或多个装饰者去包装一个对象,具体装饰类和装饰类可以组合成多种行为;
Decorator Pattern (装饰者模式)的更多相关文章
- Decorate Pattern 装饰者模式
装饰模式的定义: 动态地将责任附加到对象向,若要扩展功能,装饰模式提供了比继承更有弹性的替代方案. 遵循的设计原则是开闭原则,也是对扩展开放,对修改关闭. 下面是类图 示例代码 /** *定义被装饰者 ...
- Decorator(装饰)模式
1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继 ...
- 浅谈设计模式--装饰者模式(Decorator Pattern)
挖了设计模式这个坑,得继续填上.继续设计模式之路.这次讨论的模式,是 装饰者模式(Decorator Pattern) 装饰者模式,有时也叫包装者(Wrapper),主要用于静态或动态地为一个特定的对 ...
- java之装饰器模式
Decorator Pattern(装饰器模式),定义:Attach additional responsibilities to an object dynamically. Decorators ...
- 来杯咖啡-装饰者模式(Decorator)
前言 上篇[观察者模式]发布已经近一个月了,个人感觉反应并不太理想,因为大家响应都不是很积极,不知是文章那里写得有问题,而且也没有人提出过有价值的改进建议,多少感觉有些失望L!因为工作繁忙,所以不可能 ...
- [C++设计模式] decorator 装饰者模式
<head first>中 的样例:咖啡店有各种咖啡饮料,能够往咖啡里面加各种调料变成还有一种饮料.假设使用继承的方式来为每一种饮料设计一个类,代码的复杂度非常easy膨胀,并且会继承父类 ...
- PHP设计模式之装饰器模式(Decorator)
PHP设计模式之装饰器模式(Decorator) 装饰器模式 装饰器模式允许我们给一个类添加新的功能,而不改变其原有的结构.这种类型的类属于结构类,它是作为现有的类的一个包装 装饰器模式的应用场景 当 ...
- 设计模式系列之装饰模式(Decorator Pattern)
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类,用来包装原 ...
- 设计模式(三):“花瓶+鲜花”中的装饰者模式(Decorator Pattern)
在前两篇博客中详细的介绍了"策略模式"和“观察者模式”,今天我们就通过花瓶与鲜花的例子来类比一下“装饰模式”(Decorator Pattern).在“装饰模式”中很好的提现了开放 ...
随机推荐
- TCP长连接与短链接
1. TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次 ...
- Gridview数据导出excel时身份证号码为科学计数法的解决方法
if (e.Row.RowType == DataControlRowType.DataRow) { string id = this.GridView1.DataKeys[e.Row.RowInde ...
- iOS学习之iOS沙盒(sandbox)机制和文件操作复习
1.iOS沙盒机制 iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等. ...
- 64位系统下同时使用64位和32位的eclipse
eclipse.ini 文件使用说明 The -vm option and its value (the path) must be on separate lines. The value must ...
- POJ2352【树状数组】
个人NO.1 一开始题意理解有错. 一星星左下边有N颗星星,那它的等级就是N. 一开始理解必须X,Y两个坐标都小于,后来根据样例看了一下只要左下方即可,X,Y坐标都小于等于即可,但不包括星星本身. # ...
- How to run WPF – XBAP as Full Trust Application
Recently I work on WPF-XBAP application that will run from intranet website: This application must h ...
- Unity3D面试题总结
一.什么是渲染管道? 是指在显示器上为了显示出图像而经过的一系列必要操作. 渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去. 主要步骤有: 本地坐标->视图坐标-> ...
- linux服务器之间的文件同步;rsync+inotifywait;同步多个目录
1.双向同步:unison+inotify 2.单向同步:rsync+inotify python版的pyinotify 本文介绍第二种方法: 1.Inotify 是一个 Linux特性,它监控文件系 ...
- 第9章 初识STM32固件库—零死角玩转STM32-F429系列
第9章 初识STM32固件库 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...
- Tensorflow 之模型内容可视化
TensorFlow模型保存和提取方法 1. tensorflow实现 卷积神经网络CNN:Tensorflow实现(以及对卷积特征的可视化) # 卷积网络的训练数据为MNIST(28*28灰度单色图 ...