关闭

[设计模式]装饰模式

标签: 设计模式装饰装饰模式
185人阅读 评论(0) 收藏 举报
分类:

感谢《Android源码设计模式解析与实战》 何红辉 关爱民 著

装饰模式(Decorator Pattern)也称为包装模式(Wrapper Pattern),结构型设计模式之一,其使用一种对客户端透明的方式来动态地扩展对象的功能,同时它也是继承关系的一种替代方案之一,在现实生活中你也可以看见很多装饰模式的例子,比如人需要各式各样的衣着,不管穿什么样的衣服,对于人这个本质是不变的,这就是装饰模式


定义

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


使用场景

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


UML类图

Component : 抽象组件,可以是一个接口或抽象类,其充当的就是被装饰的原始的对象。

ConcreteComponent : 组件具体实现类,该类是Component类的基本实现,也是我们装饰的具体对象。

Decorator:抽象装饰者,其承担的职责就是为了装饰我们的组件对象,其内部一定要有一个指向组件对象的引用。在大多数情况下,该类为抽象类,需要根据不同的装饰逻辑实现不同的具体子类。当然,如果装饰逻辑单一,只有一个的情况下我们可以省略该类直接作为具体的装饰者。

ConcreteDecorattorA/B:装饰者具体实现类,只是对抽象装饰者作出具体的实现。


示例

/**
 * 抽象组件类
 * @author Administrator
 *
 */
public abstract class Component {
	/**
	 * 抽象的方法,同样你也可以增加更多的抽象方法
	 */
	public abstract void operate();
}
/**
 * 组件具体实现类
 * @author Administrator
 *
 */
public class ConcreteComponent extends Component {

	@Override
	public void operate() {
		System.out.println("ConcreteComponent operate");
	}

}
public abstract class Decorator extends Component{
	private Component component; //持有一个Component对象的引用
	
	public Decorator(Component component) {
		this.component = component;
	}
	
	@Override
	public void operate() {
		component.operate();
	}
}
/**
 * 装饰者具体实现类
 * @author Administrator
 *
 */
public class ConcreteDecoratorA extends Decorator{

	public ConcreteDecoratorA(Component component) {
		super(component);
	}
	
	@Override
	public void operate() {
		//装饰方法AB既可在父类方法前调用也可在之后调用
		operateA();
		super.operate();
		operateB();
	}

	private void operateB() {
		System.out.println("ConcreteDecoratorA operateB");
	}

	private void operateA() {
		System.out.println("ConcreteDecoratorA operateA");
	}

}
ConcreteDecoratorB与A一样就不一一添加了

public class Client {
	public static void main(String[] args) {
		//构建被装饰的组件对象
		Component component = new ConcreteComponent();
		
		//根据组件对象构建装饰者对旬日有A并调用,此时相当于给组件对象增加装饰者A的功能方法
		Decorator decorator = new ConcreteDecoratorA(component);
		decorator.operate();
		
		//根据组件对象构建装饰者对旬日有A并调用,此时相当于给组件对象增加装饰者A的功能方法
		Decorator decoratorB = new ConcreteDecoratorB(component);
		decoratorB.operate();
	}
}
运行结果:
ConcreteDecoratorA operateA
ConcreteComponent operate
ConcreteDecoratorA operateB
ConcreteDecoratorB operateA
ConcreteComponent operate
ConcreteDecoratorB operateB

总结

装饰模式和代理模式有点类似,有时甚至容易混淆,倒不是说会把代理当成装饰,而常常会是将装饰看作代理,所以大家一定要多留心,装饰模式是以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案;而代理模式则是给一个对象提供一个代理对象,并有代理对象来控制对原有对象的引用。装饰模式应该为所装饰的对象增加功能;代理模式对代理的对象施加控制,但不对对象本身的功能进行增加。









0
0
查看评论

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

导读这篇文章中我不会使用概念性文字来说明装饰者模式,因为通常概念性的问题都很抽象,很难懂,使得读者很难明白到底为什么要使用这种设计模式,我们设计模式的诞生,肯定是前辈们在设计程序的时候遇到了某种困难,为了避免这种苦难的发生,从而设计出来的这种设计模式,所以这篇文章中我会带领大家遇见这种困难,从而使用...
  • nugongahou110
  • nugongahou110
  • 2015-12-27 19:40
  • 2978

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

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

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

什么是装饰者模式好久没有更新设计模式系列的博客了, 今天我们来聊一聊装饰者模式, 用过java的同学肯定对装饰者模式非常熟悉,就算你不知道什么是装饰者模式这概念, 你也一定在代码中经常用到这个模式,为什么这么说呢? 大家都用过java中的流吧, 我们可以这样写:new BufferedOutputS...
  • qibin0506
  • qibin0506
  • 2016-04-07 08:55
  • 5379

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

首先抛开到处都有的文字概念。来看下面的例子。 现在以:人吃饭。这个需求为例。来讲解这个设计模式。 1.0:想当年,人们都比较朴实。吃饭就是简简单单的吃饭。 那么PersonBefore类里面一个简单的方法chifan(); 2.0:现如今,人们生活水平高了。吃饭的花样也多了,简单的吃饭已经不能满足...
  • qq_27093465
  • qq_27093465
  • 2016-11-24 15:34
  • 1021

调侃《HeadFirst设计模式》之装饰者模式

今天让我们继续跟随《Head First 设计模式》的足迹,聊一个新的设计模式,有了它,你将能够在不修改任何底层代码的情况下,给你的(或别人的)对象赋予新的职责。首先,按照惯例,从故事说起——     星巴兹(Starbuzz)是以扩张速度最快而闻名的咖啡连锁店。因为扩...
  • sinat_23092639
  • sinat_23092639
  • 2015-04-05 10:52
  • 874

设计模式-装饰模式(理解)

看了《大话设计模式》pdf版的装饰模式和其他博客上的一些讲解,第一遍很难get到讲解的点在哪。经国深思,记录下深思的结果。 装饰模式,其实就是用递归的方式实现了面向切面(接口)编程。面向切面编程,可以从spring框架(AOP)那里学到, 模式用途,面向切面编程,在不用修改远代码...
  • Scalaaaaaa
  • Scalaaaaaa
  • 2016-07-12 15:22
  • 265

各个设计模式的优缺点

设计原则 1、找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。 2、针对接口编程(实际上是针对超类编程),而不是针对实现编程。 策略模式(Strategy Pattern) 优点: 缺点:1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类。     ...
  • w302974215
  • w302974215
  • 2015-11-02 14:04
  • 2840

设计模式练习(9)——装饰模式

装饰模式 一、题目:简单的手机(SimplePhone)在接收到来电的时候,会发出声音来提醒主人,而现在我们需要为该手机添加一项功能,在接收来电的时候,除了有声音,还能产生震动(JarPhone),还可以得到更加高级的手机(ComplexPhone),来电时,它不仅能够发生,产生震动,而且有灯光闪烁...
  • qq_33220449
  • qq_33220449
  • 2017-01-20 15:30
  • 783

[设计模式]-装饰器模式(Decorator)

定义: 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更为灵活。 对象结构型模式
  • qust_2011
  • qust_2011
  • 2016-11-30 19:15
  • 511

<三>读<<大话设计模式>>之装饰模式

学习这个模式比前几个要难点了,搞了半天才弄懂。好吧,也许是我脑子慢        装饰者模式:装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。  &#...
  • jzhf2012
  • jzhf2012
  • 2014-10-27 14:06
  • 1669
    个人资料
    • 访问:43689次
    • 积分:912
    • 等级:
    • 排名:千里之外
    • 原创:43篇
    • 转载:38篇
    • 译文:0篇
    • 评论:2条
      我的微信公众号
      扫一扫关注我的公众号
    最新评论