1.意图

动态地给一个对象添加一些额外的功能.

2.适用性

  • 动态、透明的方式给单个对象添加职责。
  • 如果不适合适用子类来进行扩展的时候,可以考虑适用装饰模式。
  • 避免子类数目爆炸性增长。

3.结构

4.参与者

  • Component: 定义一个对象接口,可以给这些对象动态地添加职责.
  • ConcreteComponent: 定义一个对象,可以给这个对象添加职责.
  • Decorator: 持有一个指向Component对象的引用,并定义一个与Component的接口一致的接口.
  • ConcreteComponent: 向组件添加职责.

5.效果

1) 优点:

  • 比静态继承更灵活.
  • 避免在层次结果高层的类有太多的特征.

2) 缺点:

  • 产生许多小对象,增加对象复杂度,,不易排错.

6.模式应用

  • Java中的I/O流
  • 面向切面编程AOP(思想相似)

7.实例

1) 场景

一个软件公司由员工Employee组成,员工又分为开发人员Dev、领导Leader、经理Manager、QA部门领导QALeader。Dev职责是开发代码;QALeader职责不但能开发代码,而且能设计测试案例,写测试报告;Manager职责还能开发框架,发布版本。

2)UML图

3)代码

Employee

  1. public abstract class Employee {
  2. public abstract void doSomething();
  3. }

Dev

  1. public class Dev extends Employee {
  2. @Override
  3. public void doSomething() {
  4. // TODO Auto-generated method stub
  5. writeCode();
  6. }
  7. private void writeCode() {
  8. // TODO Auto-generated method stub
  9. System.out.println("I'm a programer,complete the code!");
  10. System.out.println("---------------------------------------");
  11. }
  12. }

Leader

  1. public abstract class Leader extends Employee {
  2. private Employee person;
  3. public Leader(Employee person) {
  4. super();
  5. this.person = person;
  6. }
  7. @Override
  8. public void doSomething() {
  9. person.doSomething();
  10. }
  11. }

Manager

  1. public class Manager extends Leader {
  2. public Manager(Employee person) {
  3. super(person);
  4. // TODO Auto-generated constructor stub
  5. }
  6. public void doSomething(){
  7. begin();
  8. super.doSomething();
  9. end();
  10. }
  11. private void begin() {
  12. // TODO Auto-generated method stub
  13. System.out.println("Design the framework!");
  14. System.out.println("---------------------------------------");
  15. }
  16. private void end() {
  17. // TODO Auto-generated method stub
  18. System.out.println("Release the verion!");
  19. System.out.println("---------------------------------------");
  20. }
  21. }

QALeader

  1. public class QALeader extends Leader {
  2. public QALeader(Employee person){
  3. super(person);
  4. }
  5. @Override
  6. public void doSomething() {
  7. // TODO Auto-generated method stub
  8. begin();
  9. super.doSomething();
  10. end();
  11. }
  12. private void end() {
  13. // TODO Auto-generated method stub
  14. System.out.println("Write the test reporter");
  15. System.out.println("---------------------------------------");
  16. }
  17. private void begin() {
  18. // TODO Auto-generated method stub
  19. System.out.println("Write the test cases!");
  20. System.out.println("---------------------------------------");
  21. }
  22. }

输出结果:
========leader1 doSomething==========
Write the test cases!
---------------------------------------
I'm a programer,complete the code!
---------------------------------------
Write the test reporter
---------------------------------------
========leader2 doSomething==========
Design the framework!
---------------------------------------
Write the test cases!
---------------------------------------
I'm a programer,complete the code!
---------------------------------------
Write the test reporter
---------------------------------------
Release the verion!
---------------------------------------

设计模式之适配器模式(Decorator)的更多相关文章

  1. 大型Java进阶专题(八)设计模式之适配器模式、装饰者模式和观察者模式

    前言 ​ 今天开始我们专题的第八课了.本章节将介绍:三个设计模式,适配器模式.装饰者模式和观察者模式.通过学习适配器模式,可以优雅的解决代码功能的兼容问题.另外有重构需求的人群一定需要掌握装饰者模式. ...

  2. 每天一个设计模式-3 适配器模式(Adapteer)

    每天一个设计模式-3 适配器模式(Adapteer) 1.现实中的情况 旧式电脑的硬盘是串口的,直接与硬盘连接,新硬盘是并口的,显然新硬盘不能直接连在电脑上,于是就有了转接线.好了,今天的学习主题出来 ...

  3. Head First 设计模式之适配器模式与外观模式

    Head First设计模式之适配器模式与外观模式 前言: 之前讲过装饰者模式,将对象包装起来并赋予新的职责,这一章我们也会将对象进行包装,只不过是让它们看起来不像自己而像是别的东西.这样就可以在设计 ...

  4. C#设计模式(7)——适配器模式(Adapter Pattern)

    一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用 ...

  5. Java(Android)编程思想笔记02:组合与继承、final、策略设计模式与适配器模式、内部类、序列化控制(注意事项)

    1.组合和继承之间的选择 组合和继承都允许在新的类中放置子对象,组合是显式的这样做,而继承则是隐式的做. 组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形.即在新类中嵌入某个对象,让其实 ...

  6. 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern)

    原文:乐在其中设计模式(C#) - 装饰模式(Decorator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern) 作者:weba ...

  7. 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)

    原文:乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) 作者:webabc ...

  8. C#设计模式之七适配器模式(Adapter)【结构型】

    一.引言   从今天开始我们开始讲[结构型]设计模式,[结构型]设计模式有如下几种:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.[创建型]的设计模式解决的是对象创建的问题, ...

  9. 8.3 GOF设计模式二: 适配器模式 Adapter

    GOF设计模式二: 适配器模式 Adapter  为中国市场生产的电器,到了美国,需要有一个转接器才能使用墙上的插座,这个转接 器的功能.原理?复习单实例模式  SingleTon的三个关键点  ...

随机推荐

  1. windows笔记

    三星(SAMSUNG)905S3G-K07 安装Windows 7 过程分享 http://www.cnblogs.com/scue/p/4100743.html 打开方式没有excel http:/ ...

  2. WCF方式调用asmx设置cookie

    以前旧的方式去调用web service, 可以通过CookieContainer去设置cookie,改用WCF方式去调用,则必须配置allowCookies属性为true <system.se ...

  3. UILabel + 导入字体

    UILabel * label = [[UILabel alloc]initWithFrame:CGRectMake(10, 100, 300, 100)]; 1.设置文字颜色 label.textC ...

  4. const参数,const返回值与const函数

    在C++程序中,经常用const 来限制对一个对象的操作,例如,将一个变量定义为const 的: const  int  n=3; 则这个变量的值不能被修改,即不能对变量赋值. const 这个关键字 ...

  5. mybatis常用jdbcType数据类型

    MyBatis 通过包含的jdbcType类型 BIT         FLOAT      CHAR           TIMESTAMP       OTHER       UNDEFINED ...

  6. windows系统npm如何升级自身

    其实使用npm升级各种插件是很方便的,比如我想升级express框架,使用如下命令 npm update express 如果你的express是全局安装,则 npm update -g expres ...

  7. SSO单点登录(转载)

    昨天和几位朋友探讨到了这个话题,发现虽然单点登录,或者叫做独立的passport登录虽然已经有了很多实现方法,但是能真正了解并实现的人却并不太多,所以些下此文,希望从原理到实现,能让大家了解的多一些 ...

  8. python成长之路第三篇(2)_正则表达式

    打个广告欢迎加入linux,python资源分享群群号:478616847 目录: 1.什么是正则表达式,python中得正则简介 2.re模块的内容 3.小练习 一.什么是正则表达式(re) 正则表 ...

  9. Unicode与汉字

    当遇到\u7f3a\u5c11  这样形式的字符串时,其实它代表的是汉字   具体的网上可以进行Unicode转中文   翻译

  10. ALM11客户端安装办法

    使用HP公司的QC11(ALM11.0)做项目缺陷管理,发现QC只支持IE7,IE8.其实可以通过安装ALM自已提供的浏览器就行了. 第一步:关闭UAC(用户账户控制) 第二步:打开ie,将ie-in ...