`
wangwengcn
  • 浏览: 175577 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

11.装饰模式(Decorator Pattern)

阅读更多

1.定义

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

 

2.装饰模式的使用场景

  • 需要扩展一个类的功能,或给一个类增加附加功能
  • 需要动态地给一个对象增加功能,这些功能可以动态的撤销
  • 需要为一批的兄弟类进行改装或者加装功能,当然是首选装饰模式

3.例子

我买了一辆车,这辆车会跑。
那么用代码抽象上面这句话就成了这样:

 

package _11DecoratorPattern;

public interface ICar {

	public void run();
}
 
package _11DecoratorPattern;

public class MyCar implements ICar {

	@Override
	public void run() {
		System.out.println("我的车跑到了七十码");
	}
}

 

在我开车的时候,突然觉得要是我的车有放音乐的功能就好了。
那么我们去修改MyCar实现类吗?基于开闭原则,我想这不是一个好方案。
这让我想起来了或许参考以前的代理模式能实现这个功能:

 

package _11DecoratorPattern;

public class MyMusicCar implements ICar {
	
	private ICar car;

	public MyMusicCar(ICar car)
	{
		this.car = car;
	}
	
	@Override
	public void run() 
	{
		System.out.println("最炫民族风正在响起……");
		car.run();
	}
}

好了,上面这个代码就是装饰模式。
是不是很简单?可能你要有疑问了:这不是代理模式吗?
首先要说的是,装饰模式就是代理模式的一个特殊应用,两者的共同点是都具有相同的接口,不同点是代理模式注重于对代理过程的控制(比如上面的代码如果是代理模式实现会在run里面判断油量是否充足,如果不充足,它代理的车子将不能调用run方法),而装饰模式则是对类的功能进行加强或减弱,它着重于类的功能变化。

 

4.装饰模式的四个组件

  • Component抽象构件:一个接口或者抽象类,就是定义我们最核心的对象,也就是原始的对象。
  • ConcreteComponent具体构件:是最核心、最原始、最基本的接口或抽象类的实现,你要修饰的就是它。
  • Decorator抽象装饰角色:一般是一个抽象类,在它的属性里必然有一个private变量指向Component抽象构件
  • 具体装饰角色

5.装饰模式的通用代码

 

package _11DecoratorPattern;

// 抽象构件
public abstract class Component {
	
	// 抽象的方法
	public abstract void operation();
}
 
package _11DecoratorPattern;

// 具体构件
public class ConcreteComponent extends Component {

	// 具体实现
	@Override
	public void operation() {
		System.out.println("do some thing");
	}

}
 
package _11DecoratorPattern;


// 抽象装饰类,如果只需要一个装饰,那么直接在operation方法中实现,不需要别的装饰类,否则,继续看下面的装饰类
public abstract class Decorator extends Component {

	private Component component;
	
	// 通过构造函数传递被修饰者
	public Decorator(Component component)
	{
		this.component = component;
	}
	
	// 委托给被修饰者执行
	@Override
	public void operation() {
		this.component.operation();
	}
}
 
package _11DecoratorPattern;

public class ConcreteDecorator1 extends Decorator {

	public ConcreteDecorator1(Component component) {
		super(component);
	}

	// 定义自己的修饰方法
	private void method2() {
		System.out.println("method2 修饰");
	}
	// 重写父类的修饰方法
	@Override
	public void operation() {
		super.operation();
		this.method2();
	}

}
 
package _11DecoratorPattern;

public class ConcreteDecorator2 extends Decorator {

	public ConcreteDecorator2(Component component) {
		super(component);
	}

	// 定义自己的修饰方法
	private void method1() {
		System.out.println("method1 修饰");
	}
	// 重写父类的修饰方法
	@Override
	public void operation() {
		this.method1();
		super.operation();
	}

}
 
package _11DecoratorPattern;

// 场景类
public class Client {

	public static void main(String[] args) {
		Component component = new ConcreteComponent();
		// 第一次被修饰
		component = new ConcreteDecorator1(component);
		// 第二次被修饰
		component = new ConcreteDecorator2(component);
		component.operation();
	}
}
 
结果输出:
method1 修饰
do some thing
method2 修饰

 

6.装饰模式的优点

  • 装饰类和被装饰类可以独立发展,而不会相互耦合。换句话说,Component类无需知道Decorator类,Decorator类是从外部扩展Component类的功能,而Decorator也不不用知道具体的构件。
  • 装饰模式是继承关系的一个替代方案。我们看装饰类Decorator,不关装饰多少层,返回的对象还是Component,实现的还是is-a的关系。
  • 装饰模式可以动态地扩展一个实现类的功能。

7.装饰模式的缺点

多层的装饰是比较复杂的。为什么会负责呢?你想想看,就像剥洋葱一样,你剥到了最后才发现是最里层的装饰出现了问题,想象一下工作了吧。因此,尽量减少装饰类的数量,以便降低系统的复杂度。

分享到:
评论

相关推荐

    设计模式之装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern)是一种结构型设计模式,它在不改变原有对象的基础上,通过包裹一个对象并为其添加新的行为或责任,实现对对象功能的扩展。这种模式在软件开发中非常常见,尤其当需要在运行时动态改变...

    C#设计模式_设计模式_C#_

    装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 行为型: 13. 模板方法(Template Method) 14. 命令...

    设计模式代码——c#

    8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 行为型 13. 模板方法(Template Method) ...

    23种设计模式 (创建型,结构型,行为型)

    装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 13. 模板方法(Template Method) 14. 命令...

    32种设计模式

    装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 13. 模板方法(Template ...

    装饰者模式(Decorator Pattern)原理图

    装饰者模式(Decorator Pattern)是一种结构型设计模式,它的定义是在不改变原有对象结构的基础上,动态地给该对象增加一些职责(即增加其额外功能)。这种模式允许向一个现有的对象添加新的功能,同时又不改变其...

    DecoratorPattern.rar

    在"DecoratorPattern.rar"这个压缩包中,包含了装饰器模式的简单案例demo和一个使用MindMaster绘制的脑图。通过这个案例,我们可以深入理解装饰器模式的工作原理和应用场景。 1. 装饰器模式的基本结构: - ...

    C#设计模式之Decorator 装饰模式

    装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它在不改变原有对象的基础上,通过添加额外的职责来扩展对象的功能。在C#中,装饰模式尤其适用于那些需要动态地增加或减少对象功能的情况,避免了使用...

    Head First 设计模式 (三) 装饰者模式(decorator pattern) C++实现

    装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许我们向对象添加新的行为或职责,而无需修改对象的原始代码。在C++中实现装饰者模式,可以让我们灵活地扩展对象的功能,同时保持代码的可读性和可维护性...

    c++-设计模式之装饰模式(Decorator)

    装饰模式(Decorator Pattern)是一种结构型设计模式,允许在不改变对象接口的情况下,动态地为对象添加额外的职责或功能。装饰模式通常用于需要扩展对象功能而又不希望使用子类化的场景。 装饰模式的组成 组件接口...

    java Decorator装饰模式例子

    装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时给对象添加新的行为或职责,而无需改变对象的类。在Java中,装饰模式通常通过继承和组合来实现,使得代码具有更好的扩展性和灵活性。...

    DecoratorPattern.zip

    装饰者模式(Decorator Pattern)是软件工程中一种用于动态地给对象添加职责的设计模式。它允许我们独立于对象的类来扩展对象的功能,无需修改原有代码就能增加新功能,遵循“开闭原则”。这种模式是一种结构型设计...

    装饰器(Decorator)模式

    在《Element of Reusable Object-Oriented Software》中,GOF 对装饰器模式的用意进行了概述:Decorator Pattern――Attaches additional responsibilities to an object dynamically. Decorators provide a ...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    13、装饰模式DECORATOR PATTERN 14、迭代器模式ITERATOR PATTERN 15、组合模式COMPOSITE PATTERN 16、观察者模式OBSERVER PATTERN 17、责任链模式 18、访问者模式VISITOR PATTERN 19、状态模式 20、原型模式 21...

    PHP设计模式精彩剖析

    PHP设计模式是一种面向对象编程的技术,它们提供了一套解决常见软件设计问题的经验总结和通用解决方案。设计模式可以帮助开发人员编写可重用...7. 装饰者模式(Decorator Pattern):动态地给一个对象添加额外的功能。

    Decorator pattern

    装饰者模式是一种设计模式,属于结构型模式,它允许在运行时给对象添加新的行为或责任,而无需修改对象的源代码。这种模式的核心在于,它动态地将责任附加到对象上,通过将对象包裹在一个装饰类中来扩展其功能。在...

    PHP设计模式(八)装饰器模式Decorator实例详解【结构型】

    装饰器模式(Decorator Pattern)是一种结构型设计模式,主要用于在运行时动态地给对象添加新的职责或行为,而不必改变现有对象的类定义。在面向对象编程中,装饰器模式提供了一种相对于继承更加灵活的方式来增强或...

    03_DecoratorPattern 小菜扮靓

    在"03_DecoratorPattern 小菜扮靓"这个主题中,我们可以推断作者可能以轻松幽默的方式介绍了装饰器模式的概念。"小菜"可能是用来比喻待装饰的对象,"扮靓"则表示通过装饰增强其功能或特性。博文链接指向了iteye博客...

    Decorator Pattern

    装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许我们向对象添加新的行为或职责,而无需修改对象的源代码。这种模式的核心思想是通过将功能包装在对象的外围来扩展其行为,而不是通过继承来实现。装饰...

    java 装饰模式(Decorator Pattern)详解及实例代码

    装饰模式(Decorator Pattern)是一种结构型设计模式,它可以在不修改原有对象的基础上,通过添加新的职责来扩展对象的功能。装饰模式的核心在于它定义了一个与原类一致的接口,使得装饰类和原类可以互相替换,而...

Global site tag (gtag.js) - Google Analytics