Decorator(装饰)模式

1.意图

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

在系统开发的过程中,我们希望给某个对象而不是整个类添加一些功能。例如:我们要做一扇门,现在为了能将门做的美观和安全需要给门加上锁和把手,还可能给门加上窗户和雕花。这里我们把这些要添加的东西叫做门的属性。

使用继承机制是添加功能的一种有效途径,从其他类继承过来的属性可以被多个子类的实例所使用。但这种方式不够灵活,因为如果我们的门做工过细价钱也就高,有些顾客可能不需要这样的门。这样我们就需要灵活添加门的属性。

一种较为灵活的方式是使用Decorator模式。Decorator模式的效果是:让我们可以创建以decorator对象—负责新的功能的对象—开始的一条对象“链”,并结束于最初的对象。

Decorator模式帮助我们将问题分解为两个部分:

l        如何实现提供新功能的对象。

l        如何为每种特定情况将对象组织起来。

装饰模式包括如下角色:

l        抽象构件(Component):给出一个抽象接口,以规范准备接收附加责任的对象。

l        具体构件(Concrete Component):定义一个将要接收附加责任的类。

l        装饰(Decorator):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口。

l        具体装饰(Concrete Decorator):负责给构件对象“贴上”附加的责任。

下面是Decorator模式的UML图:

1.      Component就是装饰器模式中公共方法的类,在装饰器模式结构图的顶层。

2.      ConcreateComponent是转换器模式中具体的被装饰的类,IO包中的媒体流就是此种对象。

3.      Decorator装饰器模式中的核心对象,所有具体装饰器对象的父类,完成装饰器的部分职能。在上面的例子中Decorator类和这里的对应。该类可以只做一些简单的包裹被装饰的对象,也可以还包含对Component中方法的实现……他有一个鲜明的特点:继承至Component,同时包含一个Component作为其成员变量。装饰器模式动机中的动态地增加功能是在这里实现的。

4.      ConcreteDecoratorA和ConcreteDecoratorB是两个具体的装饰器对象,他们完成具体的装饰功能。装饰功能的实现是通过调用被装饰对象对应的方法,加上装饰对象自身的方法。这是装饰器模式动机中的添加额外功能的关键。


/*

 * 定义一个抽象类派生出一个具体门(Door)和一个装饰抽象类(Decorator

 */

class Component

{

       public abstract void sampleOperation();

}//end abstract class Component

 

 

/*

 * 具体的一个门

 */

class Door :: public Component

{

       public :

void sampleOperation()

       {

              System.out.println("Build a door!");

       }//end sampleOperation()

 

}//end class Door

 

/*

 * 一个装饰抽象类,下面派生出一个用来装饰门的锁子和一个把手

 */

class Decorator::public Component

{

       private : Component component;

      

       public:

  Decorator(Component component)

       {

              this.component = component;

       }//end Decorator

       void sampleOperation()

       {

              this.component.sampleOperation();

       }//end sampleOperation()

      

}//end abctract class Decorator

 

/*

 * 用来装饰门的把手

 */

class Knob ::public Decorator

{

       public:

Knob(Component component)

       {

              super(component);

       }//end ConcreteDecorator2(...)

  void sampleOperation()

    {

         super.sampleOperation ();

         System.out.println("Add an Knob(把手)");

    }//end sampleOperation()

 

}//END CLASS Knob

 

/*

 * 用来装饰门的门锁

 */

class Lock::public Decorator

{

       public Lock(Component component)

       {

              super(component);

       }//end ConcreteDecorator1(...)

 

       public void sampleOperation()

       {

              super.sampleOperation ();

              System.out.println("Add a lock()");

       }//end sampleOperation()

 

}//end class Lock

 

public class DecoratorPattern

{

       private :

Component *door = new Door();//创建一个扇门(向下转型)

     Component* lock = new Lock(door);//添加一把锁(向下转型)

Component* knob = new Knob(lock);//再添加一个把手(向下转型)

      

       public void showDecorator()

       {

//            door->sampleOperation();

//            lock->sampleOperation();

              knob->sampleOperation();

       }//end showDecorator()

      

       public static void main(String[] args)

       {

              System.out.println("Decorator Pattern!/n");        

              DecoratorPattern* dp = new DecoratorPattern();

              dp->showDecorator();

       }//end main(...)

  

}//end class DecoratorPattern

下面是执行结果:

Decorator Pattern!

 

Build a door!

Add a lock()

Add an Knob(把手)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值