Java设计模式之装饰模式

原创 2016年08月28日 18:36:48

概述

装饰模式(Decorator)也称为包装模式(Wrapper Pattern),是结构型设计模式之一.
其使用一种对客户端透明的方式来动态地扩展对象的功能,同时他也是继承关系的一种替代方案.客户端并不需要知道对象在装饰前和装饰后有什么不同.装饰模式可以在不创建更多子类的情况下将对象的功能加以扩展.

定义

动态的给一个对象添加一些额外的职责.就增加功能来说,装饰模式相比生成子类更为灵活.

使用场景

需要透明且动态的扩展类的功能时.

UML

装饰者模式UML

其中涉及到的角色有:

  • Component : 抽象组件,可以是一个接口或抽象类,其充当的就是被装饰的原始对象.
  • ConcreteComponent : 组件具体实现类,该类是我们装饰的具体对象.
  • Decorator : 抽象装饰者,担当装饰我们组件对象的责任,内部持有指向组件对象的引用,大多数情况下是抽象类
  • ConcreteDecorator : 装饰者具体实现类,继承与Decorator

实例

这里模拟一下人穿衣服的场景,没钱的穿便宜衣服,有钱的穿贵衣服

首先定义人的抽象类

  • Component
public abstract class Person {
  //穿着的抽象方法
  public abstract void dressed();
}
  • ConcreteComponent,要装饰的对象
public class Boy extends Person {
  private static final String TAG = "Boy";
  @Override public void dressed() {
    Log.d(TAG, "dressed: --->"+"穿了内衣内裤");
  }
}
  • Decorator
public class PersonCloth extends Person {
  protected Person mPerson;

  public PersonCloth(Person _person) {
    mPerson = _person;
  }

  @Override public void dressed() {
    mPerson.dressed();
  }
}
  • ConcreteDecorator
// 没钱穿便宜衣服
public class CheapCloth extends PersonCloth {
  private static final String TAG = "CheapCloth";

  public CheapCloth(Person _person) {
    super(_person);
  }

  private void dressShorts() {
    Log.d(TAG, "dressShorts: -->" + "穿条短裤");
  }

  @Override public void dressed() {
    super.dressed();
    dressShorts();
  }
}

//有钱穿贵衣服
public class ExpensiveCloth extends PersonCloth {
  private static final String TAG = "ExpensiveCloth";

  public ExpensiveCloth(Person _person) {
    super(_person);
  }

  private void dressShirt() {
    Log.d(TAG, "dressShirt: -->" + "穿件短袖");
  }

  private void dressLeather() {
    Log.d(TAG, "dressLeather: -->" + "穿件皮衣");
  }

  private void dressJean() {
    Log.d(TAG, "dressJean: -->" + "穿件牛仔裤");
  }

  @Override public void dressed() {
    super.dressed();
    dressShirt();
    dressLeather();
    dressJean();
  }
}
  • 客户端调用方法
Person person = new Boy();
//便宜的穿法
    PersonCloth clothCheap = new CheapCloth(person);
    clothCheap.dressed();
//变有钱了,该穿好点了...
    PersonCloth clothExpensive = new ExpensiveCloth(person);
    clothExpensive.dressed();

装饰模式特点

  • 装饰和继承都可以扩展功能,但是继承是静态的,在系统运行前就决定了,装饰则是动态的扩展功能.
  • 通过不同的装饰类或者装饰组合达到不同的功能拓展,这是继承所没法达到的.

  • 装饰产生的对象结构都非常相似,像是一个模板,使得查错变得困难.

实例代码

DesignPatterns

版权声明:本文为博主原创文章,未经博主允许不得转载。

Java设计模式之桥接模式

概述桥接模式也称为桥梁模式,是结构型设计模式之一.桥接,见其名知其义,主要起到一个桥梁的作用,连接着桥梁两边.这个两边具体指的是什么呢?我们来看一下桥接模式的定义定义将抽象部分与实现部分分离,使他们都...
  • wbwjx
  • wbwjx
  • 2016年09月04日 22:56
  • 271

设计模式第六站--桥接模式PK装饰模式

设计模式学到
  • YSC1123
  • YSC1123
  • 2014年05月17日 11:32
  • 1641

JAVA设计模式之装饰模式代码

  • 2017年07月10日 13:40
  • 128KB
  • 下载

java设计模式--装饰模式

装饰模式 装饰模式(Decorator Pattern): 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 特点:...

java设计模式之装饰模式

  • 2014年12月23日 15:06
  • 2KB
  • 下载

JAVA设计模式--装饰模式

装饰( Decorator )模式又叫做包装( Wrapper )模式,它通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案。...

JAVA设计模式之 装饰模式【Decorator Pattern】

一、概述 动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。装饰模式是一种用于替代继承的技术,使用对象之间的关联关系取代类之间的继...

JAVA设计模式(11):结构型-装饰模式(Decorator)

职责: 动态的为一个对象增加新的功能。 装饰模式是一种用于代替继承的技术,无须通过继承增加之类就能扩展对象的新功能。 使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。 实现...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java设计模式之装饰模式
举报原因:
原因补充:

(最多只允许输入30个字)