`

结构型模式--装饰模式(Decorator)

阅读更多

顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下:

Source类是被装饰类,Decorator类是一个装饰类,可以为Source类动态的添加一些功能,代码如下:

[java] view plaincopy
  1. public interface Sourceable {  
  2.     public void method();  
  3. }  
[java] view plaincopy
  1. public class Source implements Sourceable {  
  2.   
  3.     @Override  
  4.     public void method() {  
  5.         System.out.println("the original method!");  
  6.     }  
  7. }  
[java] view plaincopy
  1. public class Decorator implements Sourceable {  
  2.   
  3.     private Sourceable source;  
  4.       
  5.     public Decorator(Sourceable source){  
  6.         super();  
  7.         this.source = source;  
  8.     }  
  9.     @Override  
  10.     public void method() {  
  11.         System.out.println("before decorator!");  
  12.         source.method();  
  13.         System.out.println("after decorator!");  
  14.     }  
  15. }  

测试类:

[java] view plaincopy
  1. public class DecoratorTest {  
  2.   
  3.     public static void main(String[] args) {  
  4.         Sourceable source = new Source();  
  5.         Sourceable obj = new Decorator(source);  
  6.         obj.method();  
  7.     }  
  8. }  

输出:

before decorator!
the original method!
after decorator!

装饰器模式的应用场景:

1、需要扩展一个类的功能。

2、动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删。)

缺点:产生过多相似的对象,不易排错!

 

==================================================================
 另外一个例子:

/** * Test.java 
* Created on 2013-8-1 上午10:02:29 
*/

package my;

/** 
 * <p>Project: Test2</p> 
 * <p>Title: Test.java</p> 
 * <p>Description: </p> 
 * <p>Copyright (c) 2013 Wilmar Consultancy Services</p>
 * <p>All Rights Reserved.</p>
 * @author <a href="mailto:liyong@wcs-global.com">liyong</a>
 */

public class Test {

	public static void main(String[] args) {

		Teacher t1 = new SimpleTeacher();

		Teacher t2 = new CppTeacher(t1);

		Teacher t3 = new JavaTeacher(t2);

		t3.teach();

		// t.teach();

	}

}

abstract class Teacher {

	public abstract void teach();

}

class SimpleTeacher extends Teacher {

	public void teach() {

		System.out.println("Good Good Study, Day Day Up");

	}

}

class JavaTeacher extends Teacher {

	Teacher teacher;

	public JavaTeacher(Teacher t) {

		this.teacher = t;
	}

	public void teach() {

		teacher.teach();

		System.out.println("Teach Java");

	}

}

class CppTeacher extends Teacher {

	Teacher teacher;

	public CppTeacher(Teacher t) {

		this.teacher = t;

	}

	public void teach() {

		teacher.teach();

		System.out.println("Teach C++");

	}

}

 3、===============================================================

装饰模式:给一个类添加一些额外的职责,并且在添加这些额外的职责时不会控制该类的执行逻辑。 

UML类图: 
 

组成部分: 
抽象构件:原始的功能接口 
具体构件:具体的原始功能类 
装饰角色:持有具体构件类的对象,以便执行原有功能 
具体装饰:具体扩展的功能在这里 

下面看一个对开车功能拓展的实例(晚上+开车): 
抽象构件: 

Java代码  收藏代码
  1. package com.gjy.drector;  
  2.   
  3. /** 
  4.  * 抽象接口,规范准备接收附加责任的对象 
  5.  * @author gjy 
  6.  */  
  7. public interface Component {  
  8.     public void operation();  
  9. }  


具体构件: 

Java代码  收藏代码
  1. package com.gjy.drector;  
  2.   
  3. /** 
  4.  * 接收附加责任, 此类型的类可以有多个, 只对应一个Decorator类 
  5.  * @author gjy 
  6.  */  
  7. public class ConcreteComponent implements Component {  
  8.     public ConcreteComponent(){}  
  9.     public void operation()  
  10.     {  
  11.            System.out.println("开车");  
  12.     }  
  13. }  


装饰角色: 

Java代码  收藏代码
  1. package com.gjy.drector;  
  2.   
  3. /** 
  4.  * 装饰角色,持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口 
  5.  * @author gjy 
  6.  */  
  7. public class Decorator implements Component {  
  8.     private Component component;  
  9.     public Decorator(){}  
  10.   
  11.     public Decorator(Component component)  
  12.     {  
  13.            this.component = component;  
  14.     }  
  15.   
  16.     public void operation() {  
  17.            component.operation();  
  18.     }  
  19. }  


具体装饰: 

Java代码  收藏代码
  1. package com.gjy.drector;  
  2.   
  3. /** 
  4.  * 添加附加责任 
  5.  * @author gjy 
  6.  */  
  7. public class ConcreteDecorator extends Decorator {  
  8.   
  9.     public ConcreteDecorator(){}  
  10.   
  11.     public ConcreteDecorator(Component component)  
  12.     {  
  13.            super(component);  
  14.     }  
  15.   
  16.     public void operation()  
  17.     {  
  18.          this.addedOperation();  
  19.          super.operation();  
  20.     }  
  21.   
  22.     public void addedOperation()  
  23.     {  
  24.            System.out.println("晚上");  
  25.     }  
  26. }  


测试: 

Java代码  收藏代码
  1. package com.gjy.drector;  
  2.   
  3. /** 
  4.  * 客户端类 
  5.  * @author gjy 
  6.  */  
  7.   
  8. public class Client {  
  9.        public static void main(String[] args) {  
  10.               Component component = new ConcreteComponent();  
  11.               Decorator decorator = new ConcreteDecorator(component);  
  12.               //客户端不变, 但已增加了责任  
  13.               decorator.operation();  
  14.                 
  15.        }  
  16. }  


输出结果: 
晚上 
开车 

分享到:
评论

相关推荐

    c++设计模式-结构型模式-装饰器模式

    c++设计模式-结构型模式-装饰器模式;QT工程;...装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。

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

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

    设计模式专题之(七)装饰模式---设计模式装饰模式示例代码(python--c++)

    装饰模式是一种结构型设计模式,它允许在运行时动态地给对象添加新的行为或职责,同时保持对象的接口不变。这种模式使得我们可以在不修改原有代码的基础上,通过组合不同的装饰来扩展对象的功能,实现了代码的高可...

    结构型模式之装饰模式(Decorator)

    装饰模式(Decorator)是软件设计模式中的一种结构型模式,其主要目的是在不改变对象原有类的基础上,通过添加新的行为或职责来扩展对象的功能。这种模式使得代码的扩展性非常优秀,避免了由于频繁地使用继承而导致...

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

    装饰者模式(Decorator Pattern)是结构型设计模式之一,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码。这个模式的名字来源于装饰艺术,它通过添加额外的装饰来增强一个物体的外观,同样地,...

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

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

    通过C#实现设计模式-装饰模式(DecoratorPattern).rar

    装饰模式(Decorator Pattern)是一种结构型设计模式,它允许你向一个现有的对象添加新的功能,同时又不改变其结构。装饰模式通过创建一个装饰类,该类包装了原始类的实例,并在调用原始类方法之前或之后添加额外的...

    设计模式--装饰者模式java例子

    装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改原有代码。在Java中,装饰者模式通常通过继承和组合来实现,它提供了一种比继承更灵活的方式来扩展对象的功能。...

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

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

    C++设计模式--基于Qt4开源跨平台开发框架

    结构型模式如适配器模式(Adapter)、装饰器模式(Decorator)和代理模式(Proxy),则关注如何组合和连接类与对象,以达到新的功能。行为型模式如观察者模式(Observer)、策略模式(Strategy)和访问者模式...

    [结构型模式] 装饰者模式的理解

    装饰者模式是设计模式中的一种结构型模式,它在不改变原有对象的基础上,动态地给对象添加新的行为或属性,以此来扩展对象的功能。这种模式遵循开闭原则,即对扩展开放,对修改关闭,是一种非常实用的设计策略。 ...

    C#面向对象设计模式纵横谈\10 结构型模式Decorator装饰模式.zip

    在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第10节:结构型模式Decorator装饰模式

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

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

    C#面向对象设计模式纵横谈(10):Decorator 装饰模式(结构型模式) (Level 300)

    装饰模式是一种结构型设计模式,它允许我们向一个对象添加新的功能或增强现有功能,而无需改变该对象的类。在C#中,装饰模式通常通过继承和组合来实现,它提供了一种灵活的方式来动态地改变对象的行为。在这个“C#...

    C#面向对象设计模式纵横谈(10):Decorator 装饰模式(结构型模式)

    ### C#面向对象设计模式纵横谈(10):Decorator 装饰模式(结构型模式) #### 一、背景介绍 在面向对象编程中,设计模式是一种在特定情况下解决问题的标准化方法。其中,装饰模式(Decorator Pattern)作为结构型模式...

    设计模式---装饰者模式

    装饰者模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码或创建子类。这种模式的核心思想是通过将对象封装在一个装饰器对象内,来扩展对象的功能,同时保持原有接口的不变...

    23种设计模式--装饰模式

    装饰模式是一种结构型设计模式,它是面向对象设计中用来动态添加或修改对象功能的一种方法。在软件工程中,装饰模式允许我们向一个现有的对象添加新的行为或职责,同时又不改变其原有的结构,从而实现对类的功能扩展...

Global site tag (gtag.js) - Google Analytics