设计模式重构应用---Decorator模式

先简单介绍Decorator 模式(装饰模式)的内容和应用场景。

装饰模式可以动态地给一个对象添加额外的职责。虽然,利用子类继承也可以实现这样的功能,但是 装饰模式提供了一个更灵活的方式。

因为继承会为类型引入的静态特质,使得这种扩展方式缺乏灵活性;

并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨 胀。

下面是标准Decorator 模式的UML结构图:

[此图来自GOF 《设计模式》一书]

现在结合我实际开发的一个例子谈谈这个模式的重构应用。

还是那个SEO的项目,涉及群登录、群发帖、群回复等功能。为了客户调用简单和代码重用,

设计的时候使用三个类来封装这些功能:SiteLogin、SitePost、SiteReply。每个站点的登录发帖回 复功能都是调用这三个类实现的。

刚开始设计时,只考虑一般HTTP协议的GET、POST请求,因为刚开始预研的时候,发现几个网站都是这 样处理登录发帖回复的。

随着后来,网站对象的不断增加,发现有下面的两个新需求:

1. 有些站点采用Content-Type为multipart/form-data的方式提交,而不是默认的application/x- www-form-urlencoded方式。

这两种方式,在httpclient 3.1 中处理方法是完全不同的(虽然4.0版本已经合并到一起了)。

2. 有些站点是采用https的方式提交的(增加额外的功能)。

3. 有些网站是这两种扩展需求都存在。

当然,为了应付这样的变数,处理方法有很多,可以在代码中直接使用if语句来判断,也可以通过子 类继承的方式增强这样的功能。

使用if语句的方式,处理这样比较大的需求,是不优雅的。子类继承的方式,在需求组合时会出现子 类数目爆炸式增长。

通过使用Decorator 模式的重构,可以比较好的处理这类问题。

最后设计的UML图如下(代码就不贴出来了):

 

时间: 2024-11-01 16:29:42

设计模式重构应用---Decorator模式的相关文章

C#设计模式(9)——装饰者模式(Decorator Pattern)

原文:C#设计模式(9)--装饰者模式(Decorator Pattern) 一.引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).AccessoriesPhone(挂件手机类)等,这样就会导致 "子类爆炸"问题,为了解决这个问题,我们可以使用装饰者模式来动态地给一个对象添加额外的职责.下面让我们看看装饰者模式. 二.装饰者模式的详细介绍 2.

举例讲解Java设计模式编程中Decorator装饰者模式的运用_java

概念 装饰者模式动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 装饰者和被装饰对象有相同的超类型. 你可以用一个或多个装饰者包装一个对象. 既然装饰者和被装饰对象有相同的超类型,所以在任何需要原始对象(被包装的)的场合 ,可以用装饰过的对象代替它. 装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的. 对象可以在任何时候被装饰,所以可以在运行时动态地.不限量地用你喜欢的装饰者来装饰 对象. 在Java中,io包下的很多类就是典型的装饰

设计模式的解析和实现(C++)之九-Decorator模式

作用: 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. UML结构图: 抽象基类: 1)Component:定义一个对象接口,可以为这个接口动态的添加职责. 2)Decorator:维持一个指向Component的指针,并且有一个和Component一致的接口函数.

Java设计模式之装饰模式(Decorator模式)介绍_java

Decorator常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这两种实体在Decorator模式中是必须的. Decorator定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活. 为什么使用Decorator 我们通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生

Decorator模式中遭遇继承与聚合的冲突

一:背景:Decorator *Decorator 常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这两种实体在Decorator 模式中是必须的. *Decorator 定义: 动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator 模式相比用生成子类方式达到功能的扩充显得更为灵活. *为什么使用Decorator? 我们通常可以使用继承来实现功能的拓展

Java IO 包中的Decorator模式

JDK为程序员提供了大量的类库,而为了保持类库的可重用性,可扩展性和灵活性,其中使用到了大量的设计模式,本文将介绍JDK的I/O包中使用到的Decorator模式,并运用此模式,实现一个新的输出流类. Decorator模式简介 Decorator模式又名包装器(Wrapper),它的主要用途在于给一个对象动态的添加一些额外的职责.与生成子类相比,它更具有灵活性. 有时候,我们需要为一个对象而不是整个类添加一些新的功能,比如,给一个文本区添加一个滚动条的功能.我们可以使用继承机制来实现这一功能,

PHP设计模式之装饰者模式代码实例

  这篇文章主要介绍了PHP设计模式之装饰者模式代码实例,装饰者模式就是不修改原类代码和继承的情况下动态扩展类的功能,本文就给出了代码实例,需要的朋友可以参考下 定义: 装饰者模式就是不修改原类代码和继承的情况下动态扩展类的功能.传统的编程模式都是子类继承父类实现方法重载,使用装饰器模式,只需添加一个新的装饰器对象,更加灵活,避免类数量和层次过多. 角色: Component(被装饰对象基类) ConcreteComponent(具体被装饰对象) Decorator(装饰者基类) Contret

装饰器(Decorator)模式

转自:http://miaoxiaodong78.blog.163.com/blog/static/18765136200701232434996/   Decorator设计模式是典型的结构型模式(在GOF的那本模式的Bible中将模式分为:1.创建型模式:2.结构型模式:3.行为模式三种).它的主要用意是:动态地为对象添加一些额外的功能.(记住上面两种颜色的词汇,理解装饰器模式的精髓所在!)下面是GOF的<Element of reusable Object-Oriented Softwar

连载:面向对象葵花宝典:思想、技巧与实践(40) - DECORATOR模式

掌握了设计模式之道后,我们将以全新的方法来理解设计模式,这个方法更简单.更直观,不信?看几个样例就知道了 ===================================================================== DECORATOR模式(以设计模式之道来理解) [业务] 假设你进入了一个信息安全管理非常严格的公司,这家公司不允许员工自行打印文档,所有的文档打印都需要交给文档打印系统统一管理.文档打印系统会记录每次打印的时间.内容.打印人员......等等,以便后续