您的位置:首页 > 产品设计 > UI/UE

《设计模式精解》学习笔记(十一)------Decorator(装饰)模式

2006-12-22 15:40 363 查看
《设计模式精解》学习笔记(十一)------Decorator(装饰)模式

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

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

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

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

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

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

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

一个实际的例子是Java的I/O类就广泛使用了Decorator模式,大家有兴趣可以去研究一下。直到现在我还没有研究过。

 

装饰模式包括如下角色:

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

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

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

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

下面是Decorator模式的UML图:



下面是事例代码:
package Decorator;
 

/*
 * 定义一个抽象类派生出一个具体门(Door)和一个装饰抽象类(Decorator)
 */
public abstract class Component
{
       public abstract void sampleOperation();
}//end abstract class Component
 

package Decorator;
 

/*
 * 具体的一个门
 */
public class Door extends Component
{
       public void sampleOperation()
       {
              System.out.println("Build a door!");
       }//end sampleOperation()
 

}//end class Door
 

package Decorator;
 

/*
 * 一个装饰抽象类,下面派生出一个用来装饰门的锁子和一个把手
 */
public abstract class Decorator extends Component
{
       private Component component;
      
       public  Decorator(Component component)
       {
              this.component = component;
       }//end Decorator
      
       public void sampleOperation()
       {
              this.component.sampleOperation();
       }//end sampleOperation()
      
}//end abctract class Decorator
 

package Decorator;
 

/*
 * 用来装饰门的把手
 */
public class Knob extends Decorator
{
       public Knob(Component component)
       {
              super(component);
       }//end ConcreteDecorator2(...)
 

    public void sampleOperation()
    {
         super.sampleOperation ();
         System.out.println("Add an Knob(把手)");
    }//end sampleOperation()
 

}//END CLASS Knob
 

package Decorator;
 

/*
 * 用来装饰门的门锁
 */
public class Lock extends 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
 

package Decorator;
 

public class DecoratorPattern
{
       private Component door = new Door();//创建一个扇门(向下转型)
      
       private Component lock = new Lock(door);//添加一把锁(向下转型)
       private 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(把手)

 

 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=610788  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息