写在前面
所谓装饰者模式通俗点来讲就是以原有功能为基础,在其之上包裹上一层功能,使其更加强大。Java中很多地方使用了该设计模式,典型代表就是IO流这一块儿,例如:BufferedInputStream即为装饰者类,而FileInputStream则为被装饰者类,前者的作用就是为了加强后者已有的功能,这里就是为了提高数据流的读写效率。
代码实现
代码上可以以现实生活中的房子装修为例来进行一步步的实现。既然是装饰者模式,那么必然有被装饰者和装饰者,这里我们以毛坯房为被装饰者,以装修房为装饰者;
1.首先我们先创建一个被装饰者的抽象类:FangZi
定义一个居住的抽象方法:juzhu()
public abstract class Fangzi {
protected abstract void juzhu();
}
2.接着我们创建Fangzi的具体实现类,被装饰者毛坯房:MaoPiFang
直接继承Fangzi,因为毛坯房毕竟也是房子。
public class MaoPiFang extends Fangzi {
@Override
protected void juzhu() {
System.out.println("毛坯房,可以居住");
}
}
3.然后我们在创建装饰者装修房:ZhuangXiuFang
同样直接继承FangZi,这里其实发现装修房前提你得有房吧,没有房你给谁装修,所以内部有一个fangzi的成员变量,同时juzhu的方法也是调用内部成员变量的方法,毕竟juzhu的功能还是人家毛坯房的,何况你也没说是如何装修不是。
public class ZhuangXiuFang extends Fangzi {
private Fangzi fangzi;
public ZhuangXiuFang(Fangzi fangzi) {
this.fangzi = fangzi;
}
@Override
protected void juzhu() {
fangzi.juzhu();
}
}
4.有了装修房还不行,因为具体是怎么装修是精装修还是简装修呢?所以还得创建装修房的具体类,这里我们就精装修一下吧!
创建精装修房类:JingZhuangXiuFang
public class JingZhuangXiuFang extends ZhuangXiuFang {
public JingZhuangXiuFang(Fangzi fangzi) {
super(fangzi);
}
public void juzhu(){
//这里是调用房子原有的功能,直接调用父类的juzhu方法
super.juzhu();
//这里是在原有的基础上添加的方法,也即为添加的装饰
System.out.println("精装修,我不仅可以住,而且住起来还很舒服,因为我颜值高,看着都赏心悦目");
}
}
5.最后我们看看如何调用:
public static void main(String[] args) {
Fangzi maopifang = new MaoPiFang();
JingZhuangXiuFang jingZhuangXiuFang = new JingZhuangXiuFang(maopifang);
jingZhuangXiuFang.juzhu();
}
6.运行结果:
毛坯房,可以居住
精装修,我不仅可以住,而且住起来还很舒服,因为我颜值高,看着都赏心悦目
到这里代码实现部分就结束了,看着是不是很眼熟,的确比较IO操作经常用到例如:
try {
InputStream inputStream = new FileInputStream("hello.txt");
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
bufferedInputStream.read();
} catch (Exception e) {
e.printStackTrace();
}
是不是一样一样的。
总结
装饰者模式具体实现步骤其实就是我以上说的前4步:
- 1.创建被装饰者基类;
- 2.创建被装饰者实现类;
- 3.创建装饰者基类;
- 4.创建装饰者实现类;
在装饰者类中通过有参构造方法的形式来持有一个被装饰者,在内部重写需要被拓展的方法即可;本篇如有不对之处请望大家及时指正,我立马修改谢谢!