Java设计模式之装饰模式 |
说明:装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。装饰模式的特点;(1) 装饰对象和真实对象有相同的接口。这样客户端对象就可以以和真实对象相同的方式和装饰对象交互。 下表格列举了装饰模式和继承的不同: 装饰模式 VS 继承装饰模式 继承用来扩展特定对象的功能 用来扩展一类对象的功能 不需要子类 需要子类 动态地 静态地 运行时分配职责 编译时分派职责 防止由于子类而导致的复杂和混乱 导致很多子类产生,在一些场合,报漏类的层次 更多的灵活性 缺乏灵活性 对于一个给定的对象,同时可能有不同的装饰对象,客户端可以通过它的需要选择合适的装饰对象发送消息。 对于所有可能的联合,客户期望 很容易增加任何的 困难 例子:让我们重新返回我们在工厂方法和单例模式log实用工具上,我们的模式主要由Logger 接口和两个它的实现类??FileLogger和ConsoleLogger??分别把信息出力到一个文件和屏幕中。另外,还有包括工厂方法的LoggerFactory类。 应用继承,我们要子类化FileLogger和ConsoleLogger类来增加新的功能,会有下面的一组新的子类: 从类图可以看到,为了实现新的功能加入了一组新的子类。如果我们还有其他的Logger类型(例如:DBLogger出力信息到数据库中),这样会有更多子类。当一个新的特性需要被加入,子类的数量会有成倍数的增长,同时我们会有一个庞大的类层次。 (1) LoggerDecorator包括一个Logger实例的引用。这个引用指向它包含的Logger对象。 Listing 19.1: LoggerDecorator Class
让我们定义LoggerDecorator的两个子类,HTMLLogger和EncryptLogger。 #p# 具体的Logger 装饰类 HTMLLoggerHTMLLogger重载了log方法的默认实现。在log方法中,装饰类把出力信息转化为HTML文档,并且发送给可以出力的Logger实例。Listing 19.2: HTMLLogger Class
EncryptLogger与HTMLLogger相似,EncryptLogger重载了log方法,在log方法中,EncryptLogger通过简单的将字符位置向右转移一位实现了加密逻辑,并且发送给可以出力的Logger实例。Listing 19.3: EncryptLogger Class
为了使用新设计装饰对象,客户端需要:(1) 使用LoggerFactory工厂方法创建一个合适的Logger实例(FileLogger/ConsoleLogger)。 Listing 19.4: Client DecoratorClient Class
增加新的信息出力类型在Logging Utility实例中,应用装饰模式对比使用继承不会因为类层次的增长而导致大量的子类,我们还有另外的Logger类型:DBLogger??出力信息到数据库中。为了将信息转化HTML格式或在出力到数据库以前对信息进行加密,客户端只需遵从上面提到的步骤,因为DBLogger是一种Logger类型,它可以作为构造函数的参数传递给HTMLLogger或EncryptLogger中任何一个类。增加新的装饰从例子中可以看到,LoggerDecorator实例包含了一个Logger类型了对象实例,在转发请求给Logger对象实例以前或以后,增加新的功能。因为LoggerDecorator类实现了Logger接口,LoggerDecorator实例或它的任何一个子类都可以作为一个Logger类型。因此LoggerDecortator包含它的任何子类的一个实例,并且将请求转发给它/。一般的一个装饰对象可以包含另一个装饰对象,并且可以向它转发请求。通过这种方式,新的装饰类,新的功能可以通过包装现存的装饰类来实现。以下附件文实例代码和原文! 附件:23.rar(9K) 附件:1130207322862.doc(173K) |
java---装饰模式
最新推荐文章于 2023-07-03 09:05:46 发布