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设计模式】- 装饰器模式

概述     装饰器模式:可以动态的为运行时的类添加行为。相比继承而言,继承是直接对某个类的行为进行扩展而装饰器模式是对某个对象进行扩展。     原理:增加一个修饰类去实现被修饰类相同的接口,同...
  • LightOfMiracle
  • LightOfMiracle
  • 2017年06月26日 10:32
  • 248

简单Java代码实例助你通俗易懂的理解什么是装饰(者)设计模式 (Decorator)

首先抛开到处都有的文字概念。来看下面的例子。 现在以:人吃饭。这个需求为例。来讲解这个设计模式。 1.0:想当年,人们都比较朴实。吃饭就是简简单单的吃饭。 那么PersonBefore类里面一个简单的...
  • qq_27093465
  • qq_27093465
  • 2016年11月24日 15:34
  • 1019

Java 设计模式 装饰者模式

装饰者模式 在设计的时候,往往要给一个对象的功能进行一些修饰,对功能进行拓展和增强,以满足我们的需求。    举个例子,最近流行歌曲比赛,什么《中国好声音》,《中国好歌曲》什么的,对于一个参赛者而言...
  • u010349169
  • u010349169
  • 2014年02月09日 23:57
  • 5843

浅谈JAVA设计模式之——装饰模式(Decorator)

一、概述 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。 二、适用性 1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 2.处...
  • l1028386804
  • l1028386804
  • 2015年05月03日 23:56
  • 2067

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

要想正确理解设计模式,首先必须明确它是为了解决什么问题而提出来的。 设计模式学习笔记 ——Shulin 转载请注明出处:http://blog.csdn.net/zhshulin 1、概念 ...
  • u012909091
  • u012909091
  • 2014年08月18日 20:23
  • 18643

设计模式之装饰模式和代理模式区别与联系

一.你在一个地方写装饰,大家就知道这是在增加功能,你写代理,大家就知道是在限制      1.最常见的代理就是权限判断了,权限就肯定是限制了      2.装饰模式是指增强被包装对象的功能   ...
  • sky_100
  • sky_100
  • 2016年09月13日 17:32
  • 10159

JAVA设计模式初探之装饰者模式

这个模式花费了挺长时间,开始有点难理解,其实就是 定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。 设计初衷:通常...
  • jason0539
  • jason0539
  • 2014年04月01日 09:07
  • 76510

Android设计模式之一个例子让你彻底明白装饰者模式(Decorator Pattern)

导读这篇文章中我不会使用概念性文字来说明装饰者模式,因为通常概念性的问题都很抽象,很难懂,使得读者很难明白到底为什么要使用这种设计模式,我们设计模式的诞生,肯定是前辈们在设计程序的时候遇到了某种困难,...
  • nugongahou110
  • nugongahou110
  • 2015年12月27日 19:40
  • 2975

研磨设计模式 之 装饰模式(Decorator)1——跟着cc学设计系列

22.1  场景问题 22.1.1  复杂的奖金计算        考虑这样一个实际应用:就是如何实现灵活的奖金计算。 奖金计算是相对复杂的功能,尤其是对于业务部门的奖金计算方式,是非常复杂的,...
  • u013019926
  • u013019926
  • 2013年12月05日 10:10
  • 676

设计模式-装饰者模式(Go语言描述)

什么是装饰者模式好久没有更新设计模式系列的博客了, 今天我们来聊一聊装饰者模式, 用过java的同学肯定对装饰者模式非常熟悉,就算你不知道什么是装饰者模式这概念, 你也一定在代码中经常用到这个模式,为...
  • qibin0506
  • qibin0506
  • 2016年04月07日 08:55
  • 5376
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java设计模式之装饰模式
举报原因:
原因补充:

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