`

装饰者模式——Decorator

 
阅读更多

装饰者模式—— Decorator

         有时间还是看一下《 Java 设计模式》,临近期末,为了节省时间我直接找了一些资料总结了一下。

 

1. Decorator 好处 / 目的

         A. 如果使用继承 实现功能扩展:

         我们通常使用继承来实现功能扩展,随着这些需要扩展的功能的增多,扩展功能的组合会导致更多的子类的膨胀。

         同时,使用继承实现功能的扩展,我们必须可预见这些拓展功能,这些功能编译时就确定了,是静态的。

         B. 如果使用 Decorator 实现功能扩展:

         如果扩展功能需要由用户动态决定加入的方式和时机, Decorator 提供了“即插即用”的方法,即在运行期间决定何时增加何种功能。

         这样,避免了在层次结构高层有太多的特征, Decorator 模式提供了一种“即插即用”的方法添加职责,他并不试图在一个复杂的可定制的类中支持所有可预见的特征;相反,可以定义一个简单的类,并且用 Decorator 类给他们逐渐添加功能,可以从简单的部件组合出复杂的功能。

 

         总结: The intent of Decorator is to let you compose new variations of an operation at runtime .

 

2. 如何使用 Decorator


         . Decorator 模式

 

         注意到,装饰者类 Decorator 既在①内部将被装饰者 Component 作为成员(保证请求的传递,不必实现 ConcreteComponent 已经实现的功能);又②实现了 Component 接口(保证客户端使用 Decorator 就如同使用 Component 一样)

 

         如何记忆:

         (1)记住Decorator到Component的两条线:关联——为了构造函数能传入Component;继承——为了构造函数能返回Component.

         (2)被装饰者一定要有抽象接口Component:这样才能支持装饰者模式!

 

3. Decorator 举例

         实际上, Java I/O API 就是使用 Decorator 实现的,如果采用继承的方式,将会产生很多很多子类!

         下面仅通过一个简单的例子实现上面图中的功能。

 

客户端代码: 

package decorator;

public class Client {
	public static void main(String[] args) {
		Component component=new ConcreteComponent();
		Component decorator=new Decorator(component);
		
		component.setName("小王");
		System.out.println(component.getName());
		
		decorator.setName("小王");
		System.out.println(decorator.getName());
	}
}
 

被装饰者和被装饰者实现:

package decorator;

public interface Component {
	public void setName(String name);
	public String getName();
}

public class ConcreteComponent implements Component {
	String name;

	@Override
	public String getName() {
		return name;
	}

	@Override
	public void setName(String name) {
		this.name=name;
	}
}

 

装饰者:

package decorator;

public class Decorator implements Component {
	//如果有多个组件,可能用到private List<Component> list;
	private Component component;
	
	public Decorator(Component c){
		component=c;
	}
	
	@Override
	public String getName() {
		/*
		 * 在name前加上"名字是: "——这个效果就是装饰者达到的作用
		 */
		return "名字是: "+component.getName();
	}

	@Override
	public void setName(String name) {
		component.setName(name);
	}
}
 

输出效果:


 

参见《设计模式》板桥里人 http://www.jdon.com 2002/04/28

参见 装饰模式 (Decorator) 解析例子 ,http://tianli.blog.51cto.com/190322/35287

参见《 Java 设计模式》

  • 大小: 10.1 KB
  • 大小: 3.6 KB
分享到:
评论

相关推荐

    [结构型模式] head first 设计模式之装饰者模式(decorator)

    【标题】:“装饰者模式(decorator)在Head First设计模式中的详解” 【内容】: 装饰者模式(Decorator Pattern)是结构型设计模式之一,它允许动态地给一个对象添加新的功能,而无需修改其原有代码。这个模式的...

    装饰模式——装饰模式.doc

    装饰模式是一种设计模式,属于结构型模式,其主要目的是在不改变对象本身的基础上,通过向对象添加新的行为或属性来扩展其功能。这种模式遵循“开闭原则”,即对扩展开放,对修改关闭。 在装饰模式中,有四个关键...

    .Net中的设计模式——Decorator模式

    一、模式概述一个场景是我们要为一个对象动态添加新的职责,这个职责并不修改原有的行为,而是在原有行为基础上添加新的功能,就好比装饰工人为一座新居的墙上涂抹上色彩缤纷的颜料一般。 从我们拥有的面向对象的...

    设计模式——装饰模式

    装饰模式是一种设计模式...通过阅读和理解《设计模式:可复用面向对象软件的基础》等经典书籍,以及像博客“设计模式——装饰模式”这样的在线资源,我们可以深入掌握并灵活运用装饰模式,提高代码的可维护性和扩展性。

    JAVA设计模式学习12——装饰器模式

    2. **动态性**:装饰模式允许我们在运行时动态地为对象添加新功能,而无需修改代码。 3. **组合性**:通过多个装饰者的叠加,可以实现更复杂的功能,这比使用继承来扩展功能更加灵活。 4. **职责分离**:装饰者模式...

    C#设计模式——装饰模式应用实例

    `Decorator`类是装饰模式的核心,它实现了`VisualComponent`接口,并包含一个对`VisualComponent`类型的引用。`Decorator`类的目的是为了包装一个`VisualComponent`对象,并在其基础上添加额外的行为。在本例中,...

    装饰者模式 C++ 实现

    装饰者模式是一种设计模式,它允许我们向一个对象动态地添加新的行为或责任,而无需修改对象本身的代码。在C++中实现装饰者模式,我们可以遵循以下步骤和关键概念: 1. **定义接口**:首先,我们需要定义一个基础...

    PHP5设计模式-装饰者模式

    在PHP5中,装饰者模式的应用可以帮助我们保持代码的灵活性,使得扩展功能变得容易,同时也遵循了开闭原则——对扩展开放,对修改关闭。 ### 一、装饰者模式的核心概念 1. **组件(Component)**:这是所有对象的...

    装饰者模式

    装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改对象的源代码或继承体系。装饰者模式的核心思想是将对象的原始功能与增强功能分离开来,使得在不改变原有对象的...

    设计模式——可复用面向对象软件的基础(1)

    在《设计模式——可复用面向对象软件的基础》这本书中,作者Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides(合称GoF)首次提出了23种面向对象设计模式。这些模式涵盖了不同设计场景,如创建型模式、...

    14 装饰者模式:给新房子装修.pdf

    装饰者模式(Decorator Pattern)是一种行为设计模式,它允许在运行时给对象添加新的功能,同时又不破坏其原有的结构。这种模式的核心在于通过包装(wrapping)原对象,为对象添加额外的职责,而无需修改原对象的...

    装饰器(Decorator)模式

    装饰器(Decorator)模式是一种设计模式,它允许在运行时给对象添加新的行为或责任,而无需修改对象的源代码。这种模式属于结构型模式,是面向对象设计中的一种非常实用的技术,尤其在不破坏原有类结构的情况下扩展...

    设计模式代码——c#

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

    设计模式-Java语言中的应用(pdf)

    《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。设计模式是软件工程领域中经过实践验证的、解决常见问题的有效方案,它们代表了在特定上下文中,针对特定问题的最优...

    设计模式之装饰模式:以售卖咖啡为例

    装饰模式是一种结构型设计模式...装饰模式使得代码更易于维护和扩展,符合面向对象设计原则中的开闭原则——对扩展开放,对修改关闭。因此,装饰模式在处理类似售卖咖啡这样的可扩展场景时,是一种非常实用的设计模式。

    设计模式之装饰模式.docx

    整个装饰模式的结构是按照组合模式来实现的——两者都有类似的结构图,都基于递归组合来组织可变数目的对象。 与组合模式的区别 装饰模式和组合模式都基于递归组合来组织可变数目的对象,但是两者的目的是截然不同...

Global site tag (gtag.js) - Google Analytics