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

装饰器模式

阅读更多
浅谈装饰器模式

序:
今天,为了满足我们项目组长的愿望,硬非要把一个简单的一个接口实现函数,扩展为装饰器模式进行处理。据说可以
在以后扩展的时候很有好处。于是乎,我今儿就大学了一把装饰器模式,下面我就谈谈自己的理解吧。

正文---开整:
装饰器模式,顾名思义就是给类或者接口进行装饰的模式。模式这玩意说白了就是把一些浅显易懂的东西,冠以很高深
的名词,让人摸不着头脑,有点类似于哲学。不过里面的思想不可否认还是很有道理的,不然估计也不会有那个神经病
吃多了去搞这玩意,从此让诸位欲成为编程高手的人必经的一个难关。

装饰器涉及四个名词
1、接口或者抽象基类
2、被装饰对象,也就是一个简单的实现了1中提到的接口或者抽象基类的实现类。
3、装饰对象,就是去装饰被装饰对象的对象
4、继承装饰对象类的子类,也就是具体的装饰器类了。
说了这么多,估计你基本跟没听说过一样。好了,来段代码,看看

//这是第一类名词
public interface IDecorate
{
public void sayHello();
}

//这是第二类名词
public class DecorateImpl implements IDecorate
{
public void sayHello()
{
System.out.print("Hello");
}
}

//这是第三类名词,真正的装饰器就在这里开始了,也是所有欲实现装饰器的父类
public class Decorate implements IDecorate
{
//声明一个被装饰的对象
private IDecorate decorate;

//被装饰对象从装饰器的构造函数中传进来(必须这样做)
public Decorate(IDecorate decorate)
{
this.decorate = decorate;
}

//在基类装饰器中只调用被装饰对象的方法
public void sayHello()
{
decorate.sayHello();
}
}
再对这个装饰器的基类说明一下,在每个装饰器模式中,这个类的结构基本不变
或者说这上面是装饰器第三类名词中最小的类了,必须有以上定义的这些元素。

//这是第四类名词,装饰就看这里了
public class SimpleDecorate extends Decorate
{
public Decorate(IDecorate decorate)
{
super(decorate);
}

//开装饰了哦。。。
public void sayHello()
{
//在原来的方法中加入了sayChina方法。
sayChina();

super.sayHello();

//在原来的方法中加入了sayWorld方法。
sayWorld();
}

public void sayChina()
{
System.out.print("China, ");
}

public void sayWorld()
{
System.out.print(" World!\n");
}
}

//来,测试一下
public void TestDecorate()
{
//不使用装饰器
public static void unUseDecorate(IDecorate decorate)
{
//输出 Hello
decorate.sayHello();
}

//使用装饰器
public static void useDecorate(IDecorate decorate)
{
IDecorate simpleDecorate = new SimpleDecorate(decorate);

//要调用装饰了的方法
//输出 China, Hello World!
simpleDecorate.sayHello();
}

public static void main(String[] argv)
{
IDecorate decorate = new DecorateImpl();
}
}
//是不是发现,原来只输出的hello的方法被装饰后,在其前和其后分别输出了china和world啦。

看到装饰器的威力了吧,把原来不变的方法改变了。那我们就来谈谈他的使用场景吧:
1、装饰器模式主要装饰供外部调用的接口方法,如果一个接口方法只是提供给内部调用,则不能使用该模式。
2、装饰器模式主要装饰可能要改变的接口方法,如果类中的某种行为在将来可能发生变化,而你又懒得去改变
   原来的类,那么就可以考虑使用装饰器模式了。
  
注意:模式只是解决问题的一种途径,没有必要非得在某块使用模式,所以装饰器模式这种东西,切勿刻意为之。
见识肤浅,望各位指教。



装饰模式是用于对象的创建,而此对象的创建基于原来对象的加强,也就是通过原组件对象的参数传递,把此对象层层加强。例如:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
通过层层的参数传递,把InputStream适配为InputStreamReader再装饰加强为BufferedReader。这里的参数的传递是关键,是通过引用而非继承方式。

装饰器中的继承的实质是为了类的兼容的需要,便于参数引用可以层层传递兼容,而不是通过继承实现功能的扩展,功能扩展主要在实例的引用。一般来说是纵向结构,如果只是一层继承实现,其余装饰类用横向实现的话,也是可以的,但是这个和纵向相比没有什么不同。

装饰器模式主要由两部分组成,一部分是组件,另一部分是装饰器。组件是本体,也就是初始的、最里层的参数;组件是加强件,供功能扩展时使用,顶层装饰器拥有组件的引用,装饰类可以任意组合。

其对象具有怎样的功能并不是决定于其继承结构和层次,而是在这个对象构造的时候使用到了那些类的引用,那其功能就是这些对象的总功能。
装饰器一般有一个抽象装饰器作为其顶级装饰器,包括共享的属性和方法。而抽象装饰器的所有子类从原则上来说是平等的,彼此不依赖,以便于对象构造时的功能组装。
纯净的装饰器没有扩展方法。

代码:
A a = new A();      // component
B b = new B(a);     // decorator
C c = new C(b);     // decorator: sub class of B
D d = new D(a);     // decorator: sub class of C
b具备的功能:a+b
c具备的功能:a+b+c
d具备的功能:a+d



装饰模式是在一个对象的外围创建一个称为装饰器的封装,动态地给这个对象添加一些额外的功能。以对客户端透明的方式扩展对象的功能。
装饰器中的继承的实质是为了类的兼容的需要,便于参数引用可以层层传递兼容,而不是通过继承实现功能的扩展,功能扩展主要在实例的引用。一般来说是纵向结构,如果只是一层继承实现,其余装饰类用横向实现的话,也是可以的,但是这个和纵向相比没有什么不同。

装饰器模式主要由两部分组成,一部分是组件,另一部分是装饰器。组件是本体,也就是初始的、最里层的参数;组件是加强件,供功能扩展时使用,顶层装饰器拥有组件的引用,装饰类可以任意组合。
优点:

    装饰器与继承的目的都是扩展对象的功能,但装饰器提供了比继承更大的灵活性,可以动态的决定是“粘上”还是“去掉”一个装饰。
      通过使用不同的具体装饰类和这些类的排列组合,可以创建出很多不同行为的组合。

    缺点:

    装饰器比继承关系使用更少的类,但比继承关系使用更多的对象,更多的对象会使查错变得更困难,特别是这些对象看上去很像的时候。

以蛋糕为例子,代码如下:
组件(被装饰着)Cake.java
package decorator;

public  class Cake {  
    String remark = "蛋糕";  
    public String getRemark() {  
        return remark;  
    }  


package decorator;

//抽象装饰
public abstract class Decorator extends Cake{  
    Cake cake;  
    /** 
     * 引用一个Cake. 
     * 让被装饰者进入装饰者之中。这里用的是构造方法注入。 
     * 这样就可以调用Cake实例的方法了。 
     * @param cake 
     */ 
    public Decorator(Cake cake){  
        this.cake=cake;  
    }  
    /** 
     * 让装饰器的子类都去实现getRemark方法。业务需要每个装饰器都要有描述。 
     */ 
    public abstract String getRemark();  


package decorator;

public class FlowerDecorator extends Decorator{  
   
    public FlowerDecorator(Cake cake){  
        super(cake);//调用父类的构造方法,可以获取Cake的实例了。就可以调用Cake实例的方法.  
        super.remark="一朵玫瑰花";  
    }  
       
 
    public String getRemark() {  
    return super.remark+"+"+cake.getRemark();  
    }  



package decorator;

public class ChocolateDecorator extends Decorator{
public ChocolateDecorator(Cake cake){  
        super(cake);//调用父类的构造方法,可以获取Cake的实例了。就可以调用Cake实例的方法.  
        super.remark="巧克力";  
    }

public String getRemark() {  
        return super.remark+"+"+cake.getRemark();  
    } 
}

package decorator;

public class CheeseDecorator extends Decorator{

public CheeseDecorator(Cake cake){  
        super(cake);//调用父类的构造方法,可以获取Cake的实例了。就可以调用Cake实例的方法.  
        super.remark="奶酪";  
    }

public String getRemark() {  
return super.remark+"+"+cake.getRemark();   
    } 
}

package decorator;

public class Client {
public static void main(String[] args){  
        //用果仁,花包装巧克力蛋糕。  
        Cake FlowerChocolateCheeseCake = new FlowerDecorator(new ChocolateDecorator(new CheeseDecorator(new Cake())));  
        System.out.println(FlowerChocolateCheeseCake.getRemark());  

    }  
}
分享到:
评论

相关推荐

    54-Spring设计模式之装饰器模式1

    Spring 设计模式之装饰器模式详解 在软件设计中,经常会遇到需要在不修改原有代码的情况下,添加新的功能或行为。这时,装饰器模式便可以发挥其作用。在 Spring 设计模式中,装饰器模式是非常重要的一种设计模式。 ...

    设计模式-装饰器模式

    装饰器模式是一种结构型设计模式,它允许在不修改对象本身的情况下动态地为对象添加新的行为或职责。这种模式在软件工程中广泛应用,特别是在需要扩展已有功能而不影响原有代码结构时。在iOS开发中,装饰器模式同样...

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

    装饰器模式是面向对象设计模式的一种,主要用于在不改变原有对象结构的情况下,动态地为对象增加新的功能。这种模式在Java中尤其常见,因为它允许我们遵循“开闭原则”——对扩展开放,对修改关闭。 装饰器模式的...

    23设计模式之装饰器模式-前端篇.pptx

    在前端开发中,装饰器模式常用于实现AOP(面向切面编程),比如日志记录、性能监控、权限控制等功能。通过定义装饰器函数,可以在不侵入原代码逻辑的情况下,控制代码的执行流程。例如,可以创建一个`logDecorator`...

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

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

    2 装饰器模式-MOOC课程内容.pdf

    装饰器模式是一种设计模式,它的核心思想是动态地给一个对象添加一些额外的职责。这种方式提供了一种扩展原有对象功能的方式,而且并不需要修改原有对象的代码,符合开闭原则(对扩展开放,对修改封闭)。 在装饰器...

    装饰器模式(Decorator Pattern) 1. 装饰器模式简介 1.1 问题引入 1.2 装饰器模式的解决方案 2. 装饰器模式的定义和原理 2.1 定义 2.2 基本原理 2.3 装饰器模式

    装饰器模式(Decorator Pattern) 1. 装饰器模式简介 1.1 问题引入 1.2 装饰器模式的解决方案 2. 装饰器模式的定义和原理 2.1 定义 2.2 基本原理 2.3 装饰器模式的特点 3. 装饰器模式的UML类图和基本结构 3.1 UML...

    Python装饰器模式学习demo

    以上就是"Python装饰器模式学习demo"中涉及的主要内容。通过这个项目,你可以深入理解装饰器的工作原理,以及如何在实际项目中应用它们。实践中,装饰器可用于日志记录、性能测试、权限控制等多种场景,是Python开发...

    实例讲解Ruby使用设计模式中的装饰器模式的方法

    Ruby中的装饰器模式是一种设计模式,它允许我们动态地向对象添加新的行为或职责,而无需修改原有类的代码。这种模式比继承更加灵活,因为它可以在运行时改变对象的行为,而不是在编译时通过类继承来实现。装饰器模式...

    7. 装饰器模式1

    装饰器模式是一种设计模式,它的主要目的是在不修改已有对象的基础上,动态地为对象增加新的功能。这种模式在软件工程中被广泛应用,特别是在需要扩展功能而又不希望改动原有代码的情况下,装饰器模式提供了很好的...

    30 丨 装饰器模式:如何优化电商系统中复杂的商品价格策略?.html

    30 丨 装饰器模式:如何优化电商系统中复杂的商品价格策略?.html

    java常用设计模式-装饰器模式

    Java 设计模式 - 装饰器模式 装饰器模式(Decorator Pattern)是一种结构性设计模式,它允许您在不影响同一类的其他对象的行为的情况下,静态或动态地向单个对象添加行为。该模式非常有用,当您想要在运行时添加或...

    装饰器模式 完整示例代码

    装饰器模式是一种设计模式,它允许我们向一个对象添加新的行为或责任,而无需修改该对象的源代码。这种模式是面向对象设计中用于扩展功能的一种灵活方式,它遵循“开闭原则”,即对扩展开放,对修改关闭。在Python等...

    装饰器模式、原型模式、享元模式

    装饰器模式、原型模式和享元模式是软件设计模式中的三种重要模式,它们在实际项目开发中被广泛应用,以提高系统的性能和可维护性。下面将详细解释这三种设计模式的概念、应用场景及其实现方式。 **装饰器模式...

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

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

    【Java设计模式-源码】装饰器模式:动态扩展类的功能

    装饰器模式允许在不修改对象现有代码的情况下,动态地为对象添加职责。它通过提供一种将对象“包裹”在具有类似接口的对象中的方式来实现这一点,增强了Java设计模式的灵活性。 ## 二、详细解释及实际示例 1. **...

    装饰器模式,设计模式设计模式

    装饰器模式是一种结构型设计模式,它允许在不修改对象本身的情况下动态地为对象添加新的功能。这种模式常用于在运行时改变或扩展对象的行为,而无需改变其源代码。装饰器模式的核心思想是通过将对象包装在一个装饰类...

    设计模式_装饰器模式.zip

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在...

    装饰器模式的简单demo

    装饰器模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改原有类的代码。这种模式通过创建包装对象(即装饰器)来包裹原对象,装饰器对象拥有与原对象相同的接口,因此可以在不改变...

Global site tag (gtag.js) - Google Analytics