什么是装饰者模式
装饰者模式是23种设计模式中结构型模式的一种,它的核心思想是在不必改变类文件及不使用继承的情况下,通过装饰者包裹目标对象,动态地扩展目标对象的功能。
装饰者模式的实现
接下来咱们以钢铁侠来举例,首先创建抽象组件和具体组件
package com.qianfeng.ran;
/*
*
* 抽象组件
* 人类
*/
public abstract class Human {
//行为方法
public abstract void behavior();
}
/*
* @author:
* 具体组件类
* 托尼斯塔克
*/
class TonyStark extends Human{
//拯救世界的行为
@Override
public void behavior() {
System.out.println("运用科技和财富拯救世界");
}
再创建抽象装饰者和装饰者具体实现类。
package com.qianfeng.ran;
/*
*
* 抽象装饰者
* 超级英雄类
*/
public abstract class Superhero extends Human{
private Human human;
//获取被装饰对象
public Superhero(Human human) {
this.human = human;
}
@Override
public void behavior() {
//执行目标对象原本的行为
human.behavior();
}
}
/*
*
* 具体装饰者类
* 钢铁侠类
*/
class IronMan extends Superhero {
public IronMan(Human human) {
super(human);
}
//增强目标对象的行为
@Override
public void behavior() {
super.behavior();
System.out.println("穿戴钢铁战衣拯救世界");
}
}
最后我们通过装饰者模式,来模拟没有钢铁战衣的托尼斯塔克和有钢铁战衣的区别。
package com.qianfeng.ran;
/*
*
* 客户端
*/
public class Demo {
public static void main(String[] args) {
//创建托尼斯塔克对象
TonyStark tonyStark = new TonyStark();
//执行结果:
//运用科技和财富拯救世界
tonyStark.behavior();
//通过装饰者模式使托尼斯塔克对象装饰成钢铁侠对象
IronMan ironMan = new IronMan(tonyStark);
//执行结果:
//运用科技和财富拯救世界
//穿戴钢铁战衣拯救世界
ironMan.behavior();
}
}
总结
使用装饰者模式可以动态地给目标对象添加功能,或者在原有的功能上使之更加强大,而这些功能也能动态的撤销。当不便于使用继承方式增强对象的功能,或者使用继承后不便于扩展和维护,装饰者模式就是一种很好的模式。
在IO流中,包装流使用的就是装饰者模式,例如:BufferedInputStream、BufferedOutputStream、BufferedWriter、BufferedReader等等。