设计模式之适配器模式(Decorator)

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!
---------------------------------------

来自为知笔记(Wiz)

附件列表

时间: 2024-08-08 01:07:04

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

设计模式——装饰模式(Decorator)

要想正确理解设计模式,首先必须明确它是为了解决什么问题而提出来的. 设计模式学习笔记 --Shulin 转载请注明出处:http://blog.csdn.net/zhshulin 1.概念 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 但是纯粹的装饰模式很难找到,大多数的装饰模式的实现都是"半透明"的,而不是完全透明的.换言之,允许装饰模式改变接口,增加新的方法.半透明的装饰模式是介于装饰模式和适配器模式之间的.适配器模

设计模式之适配器模式(Adapter)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

设计模式之适配器模式

适配器模式(Adapter Pattern)有时候也称包装样式或者包装.将一个类的接口转接成用户所期待的.一个适配使得因接口不兼容而不能在一起工作的类工作在一起,做法是将类别自己的接口包裹在一个已存在的类中. Adapter Pattern有两种: 类的Adapter Pattern(继承) 对象的Adapter Pattern(委托) 下面我们用第一种来实现适配器模式: 我们首先来看看类图: 具体实现如下: Banner类: public class Banner { private Stri

设计模式之适配器模式(Adapter Pattern)

适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 1. 解决的问题 即Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 2. 模式中的角色 2.1 目标接口(Target):客户所期待的接口.目标可以是具体的或抽象的类,也可以是接口. 2.2 需要适配的类(Adaptee):需要适配的类或适配者类. 2.3 适配器(Adapter):通过包装一个需要适配的对象,把

大话设计模式_适配器模式(Java代码)

适配器模式:将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 简单描述: 大话设计模式中的截图: 代码例子: AbstractPlayer类: 1 package com.longsheng.adapter; 2 3 public abstract class AbstractPlayer { 4 5 public abstract void attack(); 6 7 public abstract void defenc

螃蟹学PHP设计模式之适配器模式

之前对java的设计模式略有了解,但是螃蟹目前是靠PHP吃饭,所以对于进阶学习php设计模式还是很有必要.螃蟹虽然做开发两年了,但是在老鸟眼中还是菜鸟,为了自己写的代码更容易维护和进行团队协作,所以我要搞定设计模式.希望螃蟹今年能创业成功或找个好工作. 1.适配器模式 螃蟹的理解是你买了港行的iphone手机,发现自家的插座和手机自带的插头不配,怎么办呢,就需要一个转换器(适配器).可能原来系统的类不是你设计的,但是现在你要使用原来的类,发现有问题,但原来的类又不能动,或者不需要动,这样你写一个

Java设计模式之适配器模式(Adapter Pattern)

Adapter Pattern的作用是在不改变功能的前提下转换接口.Adapter分为两类,一类是Object Adapter, 另一类是Class Adapter.由于Class Adapter的实现需要用到多继承,而Java不支持多继承,所以这里只关注Object Adapter. 在JDK1.5之前是没有 java.util.Iterator 接口的,java.util.Enumeration 接口起着 Iterator 的作用.那么如果我们需要维护一些年代比较久远的代码,可能就会面临着没

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

Head First设计模式之适配器模式与外观模式 前言: 之前讲过装饰者模式,将对象包装起来并赋予新的职责,这一章我们也会将对象进行包装,只不过是让它们看起来不像自己而像是别的东西.这样就可以在设计中将类的接口转化为想要的接口,以实现同的接口,此外还将讲述另一个模式,将对象包装起来以简化接口. 1.   适配器简介 1.1 面向对象的适配器 真实世界的适配器比如位于美式插头和欧式插座之间的交流电适配器.面向对象的适配器是什么呢? 面向对象的适配器是将一个接口转化成另一个接口,以符合客户的期望.

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

每天一个设计模式-3 适配器模式(Adapteer) 1.现实中的情况 旧式电脑的硬盘是串口的,直接与硬盘连接,新硬盘是并口的,显然新硬盘不能直接连在电脑上,于是就有了转接线.好了,今天的学习主题出来了“适配器”. 2.联系编程 有一个电源类,一个旧的硬盘类,还有一个新硬盘类:电源类能直接适配旧硬盘类,但不能和新硬盘适配. 这时,可以添加一个适配器类,这里采用对象引用的方式实现适配器. 3.类图 模式简图: 测试时使用的类图: 4.代码 NewDiskApi: public interface