扩展系统功能——装饰模式(四):透明与半透明装饰模式,装饰模式注意事项,装饰模式总结

12.4 透明装饰模式与半透明装饰模式

      装饰模式虽好,但存在一个问题。如果客户端希望单独调用具体装饰类新增的方法,而不想通过抽象构件中声明的方法来调用新增方法时将遇到一些麻烦,我们通过一个实例来对这种情况加以说明:

在图class Decorator implements  Document

{

      private Document  document;

      

      public Decorator(Document  document)

      {

             this.  document = document;

      }

      

      public void display()

      {

             document.display();

      }

}

 

class Approver extends  Decorator

{

      public Approver(Document document)

      {

             super(document);

增加审批功能!      }

      

      public void approve()

      {

审批文件!      }

}

      大家注意,使用抽象构件类型定义

doc = new PurchaseRequest();

使用具体装饰类型定义

newDoc = new Approver(doc);

newDoc.display();//调用原有业务方法

newDoc.approve();//调用新增业务方法

如果在实际使用过程中,由于新增行为可能需要单独调用,因此这种形式的装饰模式也经常出现,这种装饰模式被称为半透明 在透明装饰模式中,要求客户端完全针对抽象编程,装饰模式的透明性要求客户端程序不应该将对象声明为具体构件类型或具体装饰类型,而应该全部声明为抽象构件类型。对于客户端而言,具体构件对象和具体装饰对象没有任何区别。也就是应该使用如下代码:

使用抽象构件类型定义对象

      而不应该使用如下代码:

使用具体构件类型定义对象

      或

使用具体装饰类型定义对象

      在……

全部使用抽象构件定义

component = new Window();

componentSB = new ScrollBarDecorator(component);

componentBB = new BlackBorderDecorator(componentSB);

componentBB.display();

……

      使用抽象构件类型具体装饰类的operation()方法覆盖抽象装饰类的operation()外还需要调用新增的用具体装饰类型来定义装饰之后的对象,而具体构件类型还是可以使用抽象构件类型来定义,这种装饰模式即为半透明装饰模式,也就是说,对于客户端而言,具体构件类型无须关心,是透明的;但是具体装饰类型必须指定,这是不透明的。如本节前面所提到的文件对象功能增加实例,为了能够调用到在……

使用抽象构件类型定义

doc = new PurchaseRequest();

使用具体装饰类型定义

newDoc = new Approver(doc);

……

半透明装饰模式可以给系统带来更多的灵活性,设计相对简单,使用起来也非常方便;但是其最大的缺点在于不能实现对同一个对象的多次装饰,而且客户端需要有区别地对待装饰之前的对象和装饰之后的对象。在实现半透明的装饰模式时,我们只需在具体装饰类中增加一个独立的思考

为什么半透明装饰模式不能实现对同一个对象的多次装饰span>

12.5 装饰模式注意事项

      在使用装饰模式时,通常我们需要注意以下几个问题:

动态增加或删除对象的职责,并使得需要装饰的具体构件类和具体装饰类可以独立变化,以便增加新的具体构件类和具体装饰类。在软件开发中,装饰模式应用较为广泛,例如在JavaIO中的输入流和输出流的设计、

练习

Sunny软件公司欲开发了一个数据加密模块,可以对字符串进行加密。最简单的加密算法通过对字母进行移位来实现,同时还提供了稍复杂的逆向输出加密,还提供了更为高级的求模加密。用户先使用最简单的加密算法对字符串进行加密,如果觉得还不够可以对加密之后的结果使用其他加密算法进行二次加密,当然也可以进行第三次加密。试使用装饰模式设计该多重加密系统。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2015年8月9日
下一篇 2015年8月9日

相关推荐