外国域名注册很多网站,网站点击率如何做,php做网站目录结构,wordpress 外链 图库目录 模式动机
模式定义
模式结构
类图
代码分析
示例#xff1a;动态添加功能的流
组件接口
具体组件
装饰抽象类
具体装饰类
客户端
模式分析
核心思想
动态扩展功能
组合优于继承
优点
动态扩展功能
组合优于继承
代码复用性高
符合开闭原则
缺点
增加…目录 模式动机
模式定义
模式结构
类图
代码分析
示例动态添加功能的流
组件接口
具体组件
装饰抽象类
具体装饰类
客户端
模式分析
核心思想
动态扩展功能
组合优于继承
优点
动态扩展功能
组合优于继承
代码复用性高
符合开闭原则
缺点
增加系统的复杂性
类的膨胀
复杂的调试
适用环境
动态扩展功能
避免继承带来的类爆炸性增长
高度可定制化的需求
模式应用
输入输出流
GUI 组件
日志记录
模式扩展
多层次装饰
结合其他设计模式
总结 模式动机
一般有两种方式可以实现给一个类或对象增加行为 继承机制使用继承机制是给现有类添加功能的一种有效途径通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法。但是这种方法是静态的用户不能控制增加行为的方式和时机。关联机制即将一个类的对象嵌入另一个对象中由另一个对象来决定是否调用嵌入对象的行为以便扩展自己的行为我们称这个嵌入的对象为装饰器(Decorator) 装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任换言之客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不需要创造更多子类的情况下将对象的功能加以扩展。这就是装饰模式的模式动机。
模式定义
装饰Decorator模式是一种结构型设计模式它允许在运行时动态地给一个对象添加新的职责或行为而无需修改原有的类结构。装饰模式的核心思想是在不改变原有对象的基础上通过组合的方式将新的职责附加到对象上。
模式结构
装饰模式包含以下几个主要角色
Component组件接口定义了被装饰对象的接口。ConcreteComponent具体组件实现了组件接口定义了具体的组件对象。Decorator装饰抽象类也实现了组件接口持有一个对组件对象的引用并通过组合的方式将新的职责附加到组件对象上。ConcreteDecorator具体装饰类实现了装饰抽象类提供了具体的装饰行为。
类图 代码分析
示例动态添加功能的流
假设我们正在开发一个文本处理系统需要支持多种文本处理功能如加密、压缩等。我们可以使用装饰模式来实现这一需求。
组件接口
// 组件接口
interface Stream {void write(String data);
}
具体组件
// 具体组件文件流
class FileStream implements Stream {Overridepublic void write(String data) {System.out.println(Writing data to file: data);}
}
装饰抽象类
// 装饰抽象类
class StreamDecorator implements Stream {protected Stream stream;public StreamDecorator(Stream stream) {this.stream stream;}Overridepublic void write(String data) {stream.write(data);}
}
具体装饰类
// 具体装饰类加密流
class EncryptedStream extends StreamDecorator {public EncryptedStream(Stream stream) {super(stream);}Overridepublic void write(String data) {String encryptedData encrypt(data);super.write(encryptedData);}private String encrypt(String data) {// 加密逻辑return Encrypted: data;}
}// 具体装饰类压缩流
class CompressedStream extends StreamDecorator {public CompressedStream(Stream stream) {super(stream);}Overridepublic void write(String data) {String compressedData compress(data);super.write(compressedData);}private String compress(String data) {// 压缩逻辑return Compressed: data;}
}
客户端
public class DecoratorPatternDemo {public static void main(String[] args) {Stream stream new FileStream();Stream encryptedStream new EncryptedStream(stream);Stream compressedStream new CompressedStream(encryptedStream);compressedStream.write(Hello, World!);}
}
模式分析
核心思想
装饰模式的核心思想是在不改变对象自身的基础上通过组合的方式将新的职责附加到对象上。装饰模式允许在运行时动态地给一个对象添加新的职责或行为而无需修改原有的类结构。
动态扩展功能
装饰模式通过装饰抽象类和具体装饰类可以在运行时动态地扩展对象的功能。具体装饰类通过继承装饰抽象类并重写其中的方法来添加新的行为。通过这种方式可以在不修改原有对象的基础上灵活地扩展对象的功能。
组合优于继承
装饰模式通过组合的方式扩展对象的功能而不是通过继承。这种方式避免了继承带来的类爆炸性增长问题并且使得系统更加灵活和可扩展。
优点
动态扩展功能
装饰模式允许在运行时动态地给一个对象添加新的职责或行为而无需修改原有的类结构。通过装饰模式可以在不改变对象自身的基础上灵活地扩展对象的功能。
组合优于继承
装饰模式通过组合的方式扩展对象的功能而不是通过继承。这种方式避免了继承带来的类爆炸性增长问题并且使得系统更加灵活和可扩展。
代码复用性高
装饰模式通过组合的方式扩展对象的功能可以复用已有的组件类和装饰类从而提高代码的复用性。
符合开闭原则
装饰模式符合开闭原则即对扩展开放对修改关闭。通过引入装饰抽象类和具体装饰类可以在不修改现有代码的情况下添加新的装饰类从而扩展系统的功能。
缺点
增加系统的复杂性
装饰模式会增加系统的复杂性因为它引入了额外的抽象类和具体装饰类。对于简单的系统使用装饰模式可能会显得过于复杂。
类的膨胀
如果需要添加的装饰类很多可能会导致装饰类的数量增加从而增加系统的维护成本。
复杂的调试
由于装饰模式通过组合的方式扩展对象的功能可能会导致对象的层次结构变得复杂从而增加调试的难度。
适用环境
动态扩展功能
当需要在运行时动态地给一个对象添加新的职责或行为时可以使用装饰模式。通过装饰模式可以在不修改对象自身的基础上灵活地扩展对象的功能。
避免继承带来的类爆炸性增长
当需要扩展对象的功能但不想使用继承机制时可以使用装饰模式。通过装饰模式可以避免继承带来的类爆炸性增长问题并且使得系统更加灵活和可扩展。
高度可定制化的需求
当需要高度可定制化的需求时可以使用装饰模式。通过装饰模式可以在运行时根据用户的需要动态地添加或移除对象的功能。
模式应用
输入输出流
在 Java 中输入输出流的实现就使用了装饰模式。例如BufferedInputStream 和 DataInputStream 都是 InputStream 的装饰类它们通过组合的方式扩展了 InputStream 的功能。
InputStream inputStream new FileInputStream(file.txt);
InputStream bufferedInputStream new BufferedInputStream(inputStream);
InputStream dataInputStream new DataInputStream(bufferedInputStream);
GUI 组件
在图形用户界面GUI中组件的扩展也经常使用装饰模式。例如一个按钮组件可以通过装饰模式添加新的功能如添加背景颜色、边框等。
Button button new Button(Click me);
Button decoratedButton new BackgroundColorButton(button, Color.BLUE);
Button finalButton new BorderButton(decoratedButton, BorderStyle.SOLID);
日志记录
在日志记录系统中可以通过装饰模式动态地添加新的日志记录方式。例如可以将日志记录到文件、数据库或网络服务器。
Logger logger new FileLogger();
Logger decoratedLogger new DatabaseLogger(logger);
Logger finalLogger new NetworkLogger(decoratedLogger);
模式扩展
多层次装饰
在某些情况下可能需要多层次的装饰。例如一个文本处理系统可能需要支持多种文本处理功能如加密、压缩、编码转换等。通过多层次的装饰可以将这些不同的功能组合在一起从而实现高度的灵活性和可扩展性。
Stream stream new FileStream();
Stream encryptedStream new EncryptedStream(stream);
Stream compressedStream new CompressedStream(encryptedStream);
Stream encodedStream new EncodedStream(compressedStream);
结合其他设计模式
装饰模式可以与其他设计模式结合使用以进一步提高系统的灵活性和可扩展性。例如
工厂模式可以使用工厂模式来创建组件对象和装饰对象从而进一步提高系统的灵活性。策略模式可以在装饰模式的基础上使用策略模式动态地选择不同的装饰策略。代理模式可以在装饰模式的基础上使用代理模式进一步增强对象的功能。
总结
装饰模式用于动态地给一个对象增加一些额外的职责就增加对象功 能来说装饰模式比生成子类实现更为灵活。它是一种对象结构型模 式。装饰模式包含四个角色抽象构件定义了对象的接口可以给这些对 象动态增加职责方法具体构件定义了具体的构件对象实现了 在抽象构件中声明的方法装饰器可以给它增加额外的职责方法 抽象装饰类是抽象构件类的子类用于给具体构件增加职责但是具 体职责在其子类中实现具体装饰类是抽象装饰类的子类负责向构 件添加新的职责。使用装饰模式来实现扩展比继承更加灵活它以对客户透明的方式动 态地给一个对象附加更多的责任。装饰模式可以在不需要创造更多子 类的情况下将对象的功能加以扩展。装饰模式的主要优点在于可以提供比继承更多的灵活性可以通过一种动态的 方式来扩展一个对象的功能并通过使用不同的具体装饰类以及这些装饰类的 排列组合可以创造出很多不同行为的组合而且具体构件类与具体装饰类可 以独立变化用户可以根据需要增加新的具体构件类和具体装饰类其主要缺 点在于使用装饰模式进行系统设计时将产生很多小对象而且装饰模式比继承 更加易于出错排错也很困难对于多次装饰的对象调试时寻找错误可能需 要逐级排查较为烦琐。装饰模式适用情况包括在不影响其他对象的情况下以动态、透明的方式给 单个对象添加职责需要动态地给一个对象增加功能这些功能也可以动态地 被撤销当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展 和维护时。装饰模式可分为透明装饰模式和半透明装饰模式在透明装饰模式中要求客 户端完全针对抽象编程装饰模式的透明性要求客户端程序不应该声明具体构 件类型和具体装饰类型而应该全部声明为抽象构件类型半透明装饰模式允 许用户在客户端声明具体装饰者类型的对象调用在具体装饰者中新增的方法。