马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
装饰模式 (Decorator Pattern)
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能, 同时又不改变其布局; 大多数情况下继承是属于高度耦合的关系, 能使用则多使用该模式更换须要多重继承
装饰类和被装饰类可以独立发展, 不会相互耦合, 装饰模式是继承的一个更换模式, 装饰模式可以动态扩展一个实现类的功能;
比如, JDK中的处置惩罚IO流中的FilterInputStream BufferedInputStream 均对 InputStream 做了包装- java.io.InputStream
- java.io.FilterInputStream
- java.io.BufferedInputStream
复制代码 装饰类和被装饰类可以独立发展, 不会相互耦合, 装饰模式是继承的一个更换模式, 装饰模式可以动态扩展一个实现类的功能;
意图: 动态地给一个对象添加一些额外的职责; 就增长功能来说, 装饰器模式相比天生子类更为机动;
重要办理: 一样寻常的, 我们为了扩展一个类经常使用继承方式实现, 由于继承为类引入静态特性, 而且随着扩展功能的增多, 子类会很膨胀;
计划模式是什么鬼(装饰)
代码实例
例: 一个毛坯房装修的例子
1.界说一个房子的展示活动 (抽象主体)
- public interface Showable {
- public void show();//定义展示行为
- }
复制代码 2.最原始的毛坯房啥也没有 (原始实现)
- public class House extends Showable {
- public void show(){
- System.out.print("毛坯房")
- }
- }
复制代码 3.开始装修: 先粉刷一遍 (装饰1)
- public class PinkHouse extends Showable {
- public Decorator(Showable showable) {//待粉刷的 House
- this.showable = showable;
- }
- public void show(){
- System.out.print("粉色的(")
- showable.show();
- System.out.print(")");//粉刷完工
- }
- }
复制代码 4.再装一点灯饰 (装饰2)
- public class LightHouse extends Showable {
- public Decorator(Showable showable) {//待装饰的 House
- this.showable = showable;
- }
- public void show(){
- System.out.print("十分明亮的(")
- showable.show();
- System.out.print(")");//装饰完工
- }
- }
复制代码 5.测试
- public static void main(String[] args) {
- Showable hose = new LightHouse(//十分明亮的
- new PinkHouse(//粉色的
- new House()//毛坯房
- )
- );
- hose.show();
- }
复制代码 in short 像包装一样, 每增长一个功能, 多一层包装, 使得即添加新功能, 同时又不改变其布局
装饰器模式总结
关键脚色
- 抽象主体
- 具体主体(被装饰者)
- 装饰者脚色(多个, 扩展 被装饰者的功能)
装饰器模式的优缺点
装饰器模式的优点:
- 对于扩展一个对象的功能,装饰模式比继承更加机动,不会导致类的个数急剧增长 ,
- 可以通过一种动态的方式来扩展一个对象的功能,通过设置文件可以在运行时选择差别的具体装饰类,从而实现差别的活动.
- 可以对一个对象举行多次装饰,通过使用差别的具体装饰类以及这些装饰类的分列组合可以创造出很多差别活动的组合,得到更加强盛的对象.
- 具体构建类与具体装饰类可以独立厘革,用户可以根据须要增长新的具体构建类和具体装饰类,原有类库代码无需改变,符合开闭原则.
in short 比继承机动; 可动态的, 多次的组合; 各个类之间独立
装饰器模式的缺点:
- 在使用装饰模式举行体系计划时将产生很多小对象,这些对象的区别在于它们之间相互毗连的方式有所差别,而不是它们的类大概属性值差别,大量的小对象的产生势必会占用更多的体系资源,在肯定程度上影响步伐的性能.
- 装饰器模式提供了一种比继承更加机动、机动的办理方案,但同时也意味着比继承更加易于堕落,排错也更加困难,对于多次装饰的对象,在调摸索求错误时大概须要逐级排查,较为烦琐.
in short 容易产生很多的小对象; 调试困难
装饰器模式的实用场景
- 快速动态扩展和取消一个类的功能场景。 比如,有的场景下对 API 接口的安全性要求较高,那么就可以使用装饰模式对传输的字符串数据举行压缩或加密。如果安全性要求不高,则可以不使用。
- 不支持继承扩展类的场景。 比如,使用 final 关键字的类,大概体系中存在大量通过继承产生的子类。
|