最近看了一个视频教程,讲到装饰者模式,为加深一下理解,所以在这里做个笔记
一,为什么要用到装饰者模式
开发中,有时我们需要对一个对象的功能进行增强。通常的增强方式有:
1. 继承
被增强的对象是固定的,不能改变
增强也是固定的,不能改变
2. 装饰者模式
被增强的对象是可以变化的
增强的内容是固定的
3. 动态代理
为什么在有的时候要使用装饰者模式:
(这个例子是学习材料中说的,不是我自己想出来的)
比如说有一个咖啡类,他下面分别有加糖咖啡,加奶咖啡,加盐咖啡。当我们需要加糖加奶咖啡,加奶加盐咖啡……
class 咖啡类{ }
class 加糖咖啡 extennds 咖啡类{ }
class 加奶咖啡 extennds 咖啡类{ }
class 加盐咖啡 extennds 咖啡类{ }
……
这种排列组合会使类的数目暴增,当我们在后来又有了比如说加柠檬的咖啡时,又会增加很多组合。
这种情况下我们就需要使用装饰者模式了。
二,装饰者模式Demo代码实现
是你还有你,一切拜托你。
1. 装饰类继承或者实现装饰类。
2. 在装饰类中含有一个被装饰类的对象作为成员,在构造方法中可以传入一个被装饰类的对象,对这个成员进行初始化,然后我们就可以进行功能的增强。
代码:
//接口
public interface Kafei {
/**
* 口味
*/
public void kouwei();
}
实现类:
加奶类:
public class NaiKafei implements Kafei {
private Kafei kafei;
public NaiKafei() {
}
public NaiKafei(Kafei kafei) {
this.kafei = kafei;
}
@Override
public void kouwei() {
System.out.print("加奶");
if (kafei != null) {
// 此时使用的是有参数的构造方法,说明咖啡要加多种材料
kafei.kouwei();
}
}
}
加糖类:
public class TangKafei implements Kafei {
private Kafei kafei;
public TangKafei() {
}
public TangKafei(Kafei kafei) {
this.kafei = kafei;
}
@Override
public void kouwei() {
System.out.print("加糖");
if (kafei != null) {
// 此时使用的是有参数的构造方法,说明咖啡要加多种材料
kafei.kouwei();
}
}
}
加盐类:
public class YanKafei implements Kafei {
private Kafei kafei;
public YanKafei() {
}
public YanKafei(Kafei kafei) {
this.kafei = kafei;
}
@Override
public void kouwei() {
System.out.print("加盐");
if (kafei != null) {
// 此时使用的是有参数的构造方法,说明咖啡要加多种材料
kafei.kouwei();
}
}
}
测试类:
public class Demo {
@Test
public void fun1() {
// 加糖咖啡
Kafei tangKafei = new TangKafei();
tangKafei.kouwei();
}
@Test
public void fun2() {
// 加奶加糖咖啡
Kafei naiKafei = new NaiKafei();
Kafei tangKafei = new TangKafei(naiKafei);
tangKafei.kouwei();
}
@Test
public void fun3() {
// 加奶加糖加盐咖啡
Kafei naiKafei = new NaiKafei();
Kafei tangKafei = new TangKafei(naiKafei);
Kafei yanKafei = new YanKafei(tangKafei);
yanKafei.kouwei();
}
}
在测试类中,我们可以看到我们可以随意进行组合,而类的数量只有基础的几个。