装饰者模式
为什么会有?
说明之前我们先来举一个例子.
首先我们有一个Woman对象,他分别有颜值,智商两个属性和一个说话的方法.
然后我们依次需要 化过妆的woman. 高学历的woman.和有礼貌的woman.
化过妆的woman颜值会变高;
高学历的woman智商会变高;
有礼貌的woman说话时会变的有礼貌;
怎么得到这三个对象呢?
显然需要通过继承woman这个父对象来实现;
将三个对象分别继承woman,并重写其getBeauy()方法,getIq()方法,和say()方法;
这显然很容易实现;
但是问题来了,化过妆的woman. 高学历的woman.和有礼貌的woman.并不是独立存在的,
什么意思呢?
我们可能也会需要即化过妆,有高学历的woman,或者化过妆的有礼貌的woman,或者高学历的有礼貌的woman,又或者化过妆的高学历的有礼貌的woman.
这时候我们要怎么办呢?
有人可能会说了,我创建一个woman让他继承化过妆的woman,在重写他的getIq()方法让他的智商也变高,就得到了化过妆,有高学历的woman,再创建一个woman 去继承高学历的woman,在重写他的say()方法让他变得有礼貌,就得到了高学历有礼貌的woman. 依次类推就可以得到所有的woman了.
我先不说这个方法究竟有多麻烦,我们先看看他的代码重复的问题就是我们无法忍受的.
我们再得到化过妆,有高学历的woman的时候,有两种方法,一种是继承化过妆的woman,在重写他的getIq()方法让他的智商也变高,但是重写getIq()方法我们在得到高学历的woman时已经做过了再次做显而易见会形成重复代码;还有一种是继承高学历的woman,重写他的getBeauy()方法,同理getBeauy()方法在得到化过妆的woman的时候也已经重写过了.
我们再来看他的复杂程度,先不说三种基础的,只看 掌握2种以上的woman 都有3种,每种有两种不同的继承方法,
掌握3种的技能的woman有一种,有3中继承方法,这只是3个属性或方法的情况,就衍生出7种的不同的woman类,如果有4个属性呢?5个属性呢?实际情况是会生成一套极其复杂的继承体系.但是这并不是我们想要的.
我们又该如何解决这个问题呢?
这就用到了我们的装饰者模式!
/***
* 装饰者模式的核心内容
* WapperWoman持有被装饰者 Woman的类对象;
* 通过这种方法,可以将包装过的类对象作为参数传给下一个包装类进行再次包装.
* 通过这种方法实现对某个类进行多次包装.
*/ 具体代码如下:
public abstract class WapperWoman extends Woman {
/***
* 装饰者模式的核心内容
* WapperWoman持有被装饰者 Woman的类对象;
* 通过这种方法,可以将包装过的类对象作为参数传给下一个包装类进行再次包装.
* 通过这种方法实现对某个类进行多次包装.
*/
private Woman woman;
public WapperWoman(Woman woman) {
super(woman.getName(), woman.getBeauty(), woman.getIq());
this.woman = woman;
}
@Override
public String getName() {
return woman.getName();
}
public int getBeauty() {
return woman.getBeauty();
}
public int getIq() {
return woman.getIq();
}
public void say(){
System.out.println("我叫"+woman.getName());
}
}
然后,我们的会化妆的woman、高学历的woman.和有礼貌的woman.再去继承WapperWoman这个包装类,分别重写他的getBeauy()方法,getIq()方法,和say()方法.
如果我们需要会化妆高学历的woman时只需要
Woman woman = new DressedWoman(new EducatedWoman);
就得到了化妆高学历的woman;
怎么样?是不是很方便呢?这就是装饰者模式的核心内容.请仔细体会.