装饰者模式( Decorator Pattern )

意图 : 动态的给一个对象添加一些额外的功能,IO这块内容体现出了装饰模式,Decorator模式相比生成子类更为灵活。

角色 :

1)抽象构件角色(Component)--- 定义成一个接口类型

2)具体构件角色 (ConcreteComponent) --- 该类(被装饰者)实现了 Component 接口,

3)装饰角色 (Decorator) --- 该类实现了 Component 接口,并持有 Component接口的引用

4)具体装饰角色 (ConcreteDecorator) --- 该类继承了装饰类

UML实现:

代码实现:

Component.java

  1. package com.decorator ;
  2. //抽象构件角色
  3. public interface Component
  4. {
  5. public void operation() ;
  6. }

ConcreteComponent.java

  1. package com.decorator ;
  2. //具体构件角色
  3. public class ConcreteComponent implements Component
  4. {
  5. public void operation()
  6. {
  7. System.out.println("实现功能A") ;
  8. }
  9. }

Decorator.java

  1. package com.decorator ;
  2. //装饰角色,持有一个构件角色的引用
  3. public class Decorator implements Component
  4. {
  5. Component component = null ;
  6. public Decorator(Component component)
  7. {
  8. this.component = component ;
  9. }
  10. public void operation()
  11. {
  12. this.component.operation() ;
  13. }
  14. }

ConcreteDecoratorA.java

  1. package com.decorator ;
  2. //具体装饰角色A
  3. public class ConcreteDecoratorA extends Decorator
  4. {
  5. public ConcreteDecoratorA(Component component)
  6. {
  7. super(component) ;
  8. }
  9. public void operation()
  10. {
  11. super.operation() ;
  12. System.out.println("实现功能B") ;
  13. }
  14. }

ConcreteDecoratorB.java

  1. package com.decorator ;
  2. //具体装饰角色B
  3. public class ConcreteDecoratorB extends Decorator
  4. {
  5. public ConcreteDecoratorB(Component component)
  6. {
  7. super(component) ;
  8. }
  9. public void operation()
  10. {
  11. super.operation() ;
  12. System.out.println("实现功能C") ;
  13. }
  14. }

Client.java

  1. package com.decorator ;
  2. public class Client
  3. {
  4. public static void main(String[] args)
  5. {
  6. //装饰者一般不用出现在客户端 , 因它内部自己会处理
  7. //ConcreteComponent cc = new ConcreteComponent() ;
  8. //ConcreteDecoratorA cd = new ConcreteDecoratorA(cc) ;
  9. //ConcreteDecoratorB cd2 = new ConcreteDecoratorB(cd) ;
  10. //cd2.operation() ;
  11. //上面的代码等价于下面的代码
  12. ConcreteDecoratorB cd = new ConcreteDecoratorB(new ConcreteDecoratorA(new ConcreteComponent())) ;
  13. cd.operation() ;
  14. }
  15. }

小结:

装饰者和被装饰者拥有共同的接口;

装饰者一般不用客户端去调用 , 因它内部自己会处理;

可以用一个或多个装饰者去包装一个对象,具体装饰类和装饰类可以组合成多种行为;

Decorator Pattern (装饰者模式)的更多相关文章

  1. Decorate Pattern 装饰者模式

    装饰模式的定义: 动态地将责任附加到对象向,若要扩展功能,装饰模式提供了比继承更有弹性的替代方案. 遵循的设计原则是开闭原则,也是对扩展开放,对修改关闭. 下面是类图 示例代码 /** *定义被装饰者 ...

  2. Decorator(装饰)模式

    1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继 ...

  3. 浅谈设计模式--装饰者模式(Decorator Pattern)

    挖了设计模式这个坑,得继续填上.继续设计模式之路.这次讨论的模式,是 装饰者模式(Decorator Pattern) 装饰者模式,有时也叫包装者(Wrapper),主要用于静态或动态地为一个特定的对 ...

  4. java之装饰器模式

    Decorator Pattern(装饰器模式),定义:Attach additional responsibilities to an object dynamically. Decorators  ...

  5. 来杯咖啡-装饰者模式(Decorator)

    前言 上篇[观察者模式]发布已经近一个月了,个人感觉反应并不太理想,因为大家响应都不是很积极,不知是文章那里写得有问题,而且也没有人提出过有价值的改进建议,多少感觉有些失望L!因为工作繁忙,所以不可能 ...

  6. [C++设计模式] decorator 装饰者模式

    <head first>中 的样例:咖啡店有各种咖啡饮料,能够往咖啡里面加各种调料变成还有一种饮料.假设使用继承的方式来为每一种饮料设计一个类,代码的复杂度非常easy膨胀,并且会继承父类 ...

  7. PHP设计模式之装饰器模式(Decorator)

    PHP设计模式之装饰器模式(Decorator) 装饰器模式 装饰器模式允许我们给一个类添加新的功能,而不改变其原有的结构.这种类型的类属于结构类,它是作为现有的类的一个包装 装饰器模式的应用场景 当 ...

  8. 设计模式系列之装饰模式(Decorator Pattern)

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类,用来包装原 ...

  9. 设计模式(三):“花瓶+鲜花”中的装饰者模式(Decorator Pattern)

    在前两篇博客中详细的介绍了"策略模式"和“观察者模式”,今天我们就通过花瓶与鲜花的例子来类比一下“装饰模式”(Decorator Pattern).在“装饰模式”中很好的提现了开放 ...

随机推荐

  1. 【bzoj1875】【JZYZOJ1354】[SDOI2009]HH去散步 矩阵快速幂 点边转换

    http://172.20.6.3/Problem_Show.asp?id=1354 http://www.lydsy.com/JudgeOnline/problem.php?id=1875  题意: ...

  2. BZOJ 2434 [Noi2011]阿狸的打字机(AC自动机)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2434 [题目大意] 给出一个打印的过程,'a'-'z'表示输入字母,P表示打印该字符串 ...

  3. bzoj2938 病毒

    Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码 ...

  4. linux基础命令学习(二)文件和目录操作

    1.变换当前目录(change directory)     cd /home 进入 '/ home' 目录'  (change directory)   cd .. 返回上一级目录    cd .. ...

  5. mybatis源码分析(1)-----sqlSessionFactory创建

    1. 首先了解一下mybatis,包含核心jar ,以及spring相关jar. <!-- Mybatis相关组件 --> <dependency> <groupId&g ...

  6. 桥接模式:探索JDBC的接口

    目录概要 场景问题 假设要设计一个电脑商场管理系统的某个模块设计,电脑分为品牌和类型两个纬度,我们应该怎么解决?我们初学者最容易想到的办法就是利用继承的方式,那利用继承实现的类图又是什么样子呢?我们看 ...

  7. Centos 6/ 7下通过yum安装php7环境

    本文转自:云溪社区 2015年12月初PHP7正式版发布,迎来自2004年以来最大的版本更新.PHP7最显著的变化就是性能的极大提升,已接近Facebook开发的PHP执行引擎HHVM.在WordPr ...

  8. Java中文件与字节数组转换

    注:来源于JavaEye 文件转化为字节数组: http://www.javaeye.com/topic/304980 /** * 文件转化为字节数组 * * @param file * @retur ...

  9. C# 如何做类似微博和QQ的授权登录

    记录下吧,dotnet下有这个http://dotnetopenauth.net/开源的框架可以用来实现服务端和客户端的实现,具体的使用方法还真研究,第一次接触OAuth这个概念

  10. OpenERP实施记录(13):出库处理

    本文是<OpenERP实施记录>系列文章的一部分. 在前面的文章中,业务部门接到沃尔玛3台联想Y400N笔记本电脑的订单,ABC公司立即采购了8台(3台送货+5台备库存)回来,完成了入库和 ...