分享
 
 
 

Java设计模式之装饰模式(1)

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

说明:装饰模式是在不必改变原类文件和使用继续的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

装饰模式的特点;

(1) 装饰对象和真实对象有相同的接口。这样客户端对象就可以以和真实对象相同的方式和装饰对象交互。

(2) 装饰对象包含一个真实对象的索引(reference)

(3) 装饰对象接受所有的来自客户端的请求。它把这些请求转发给真实的对象。

(4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继续来实现对给定类的功能扩展。

下表格列举了装饰模式和继续的不同:

装饰模式 VS 继续装饰模式 继续

用来扩展特定对象的功能 用来扩展一类对象的功能

不需要子类 需要子类

动态地 静态地

运行时分配职责 编译时分派职责

防止由于子类而导致的复杂和混乱 导致很多子类产生,在一些场合,报漏类的层次

更多的灵活性 缺乏灵活性

对于一个给定的对象,同时可能有不同的装饰对象,客户端可以通过它的需要选择合适的装饰对象发送消息。 对于所有可能的联合,客户期望

很轻易增加任何的 困难

例子:

让我们重新返回我们在工厂方法和单例模式log实用工具上,我们的模式主要由Logger 接口和两个它的实现类??FileLogger和ConsoleLogger??分别把信息出力到一个文件和屏幕中。另外,还有包括工厂方法的LoggerFactory类。

LoggerFactory没有出现在下图中,主要是因为它和现在讨论的例子没有直接联系。

让我们想象一些客户端需要以超出Logger Utility现在所提供的新的方式出力信息,客户端需要下面两种特征;

(1) 把出力的信息传唤为Html文档

(2) 对出力信息进行逻辑转化的简单加密,在面向对象的设计中,不改变现存的类的代码,可以应用继续来增加新的功能。例如,子类化现在的类重载它的方法来增加所需要的新功能。

应用继续,我们要子类化FileLogger和ConsoleLogger类来增加新的功能,会有下面的一组新的子类:

子类 父类 功能

HTMLFileLogger FileLogger 转化出力信息为HTML文档,并存入一个Log文件

HTMLConsLogger ConsoleLogger 转化出力信息为HTML文档,并显示在屏幕上

EncFileLogger FileLogger 加密出力信息,并存入一个Log文件

EncConsLogger ConsoleLogger 加密出力信息,并显示在屏幕上

从类图可以看到,为了实现新的功能加入了一组新的子类。假如我们还有其他的Logger类型(例如:DBLogger出力信息到数据库中),这样会有更多子类。当一个新的特性需要被加入,子类的数量会有成倍数的增长,同时我们会有一个庞大的类层次。

装饰模式使我们从这种情景中解脱出来,装饰模式推荐通过对象的合成而不是继续来包装一个对象扩展它的功能。

应用装饰模式,让我们为Logger Utility定义一个有下列特征的默认根装饰类LoggerDecorator:

(1) LoggerDecorator包括一个Logger实例的引用。这个引用指向它包含的Logger对象。

(2) LoggerDecorator实现Logger借口、提供Log方法的基本的默认实现,他只是简单的转发调用给它包含的Logger 对象。每一个LoggerDecorator子类保证定义log方法。

Listing 19.1: LoggerDecorator Class

public class LoggerDecorator implements Logger {

Logger logger;

public LoggerDecorator(Logger inp_logger) {

logger = inp_logger;

}

public void log(String DataLine) {

/*

Default implementation

to be overriden by subclasses.

*/

logger.log(DataLine);

}

}//end of class

每一个logger的装饰定义log方法使很重要的,因为装饰对象必须提供和它包装的对象相同的借口。当客户端创建一个装饰类的实例,客户端以与装饰类交互方式和客户端与拥有相同接口原对象的交互方式是一致的。

让我们定义LoggerDecorator的两个子类,HTMLLogger和EncryptLogger。

说明:装饰模式是在不必改变原类文件和使用继续的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

装饰模式的特点;

(1) 装饰对象和真实对象有相同的接口。这样客户端对象就可以以和真实对象相同的方式和装饰对象交互。

(2) 装饰对象包含一个真实对象的索引(reference)

(3) 装饰对象接受所有的来自客户端的请求。它把这些请求转发给真实的对象。

(4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继续来实现对给定类的功能扩展。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有