开闭原则 OCP(open - close principle)<勃兰特 梅耶 1988 年提出 >
在开始这一设计模式的分析之前,很有必要先来重温一下这个很重要但是在实际运用中很多地方会被打破的面向对象设计原则 -- 开闭原则。
开闭原则最初始的定义是:在程序设计中的类要对扩展开放,对修改关闭。这个原则定义的初衷是为了更好的对软件进行维护,防止在软件版本更新迭代的过程中引入错误,从而破坏系统原有的功能。当热在软件需要变化时,我们应该尽量通过扩展的方式实现变化,而不是修改现有的代码来实现,也就是遵循开闭原则。但在实际的开发过程中,修改原有的代码,扩展代码往往是同时存在的。也就说每个地方都遵循OCP原则是一种浪费,也没有必要,因为这会导致代码变得负责且难以理解!
今天要聊的装饰者模式就是完全遵循开闭原则的一种设计模式。
认识装饰者模式 (动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案)
装饰者模式的类图Component : 被装饰者的抽象接口
ConcreteComponent :具体的被装饰者对象
Decorator:装饰者的抽象
ConcreteDecorator :具体的装饰者对象
软件行业有一名言,没有什么功能是包一层不能实现的,如果有那就再包一层。虽然是玩笑话,但毕竟再软件开发中很多地方有用到。
简而言之:装饰者模式中 被装饰者与装饰者必须继承同一个抽象,也就是说装饰者与被装饰者拥有共同的超类,装饰者的出现只是为了能更好的扩展被装饰者的功能。因此被装饰者会持有一个被装饰者的对象(最好是装饰者与被装饰者共同的抽象)。如果依赖继承,那么类的行为只能在编译时静态决定,如果利用组合,那么类的行为是在运行时决定!
装饰者模式与代理模式的区别:
JDK中用到的中用到的装饰者模式 (IO)
先复习下java 中的 IO
1.java类库中I/O类分为输入与输出两种类型。
2.任何派生自 inputStream与Reader 的类都包含有名为read()的方法,用于读取单个字节或者字节数组。称之为输入流
3.任何派生自outputStream与Writer的类都包含有名为write()的方法,用于写入单个字节或者字节数组。称之为输出流
JDK中输入流的类图结构:
InputStream的类图
网友评论