装饰者设计模式主要功能在于动态的给类添加行为,和继承不一样的就是继承是死的,功能扩展出来就不能变了,除非继续改继承后的子类,这样会造成类特别多或者总是修改子类。
而装饰者设计模式可以把每种行为定义成一个类,装饰类和被装饰的类都有共同的超类,这样装饰者也可以变成被装饰者,这也算体现了多态吧。装饰者设计模式的继承,继承类型,扩展行为,而不是继承的行为。方法全部交给超类调用,实际执行的是子类的方法,而装饰者的构造方法参数是超类,而装饰者也继承自超类,所以装饰者之间也可以一层一层嵌套,从而实现了扩展。装饰也就是跟穿衣打扮一样,可以一层一层套,产生的效果共同起作用。
装饰者设计模式有一个很重要的思想:对扩展开放,对修改关闭。
看下面的例子:
package cn.xuhaixing.decorator;
/**
* 所有装饰着与被装饰者的超类
* @author xuhaixing
*
*/
public abstract class Meat {
public abstract void makeMeat();
}
package cn.xuhaixing.decorator;
/**
* 被装饰者
* @author xuhaixing
*
*/
public class PigMeat extends Meat {
@Override
public void makeMeat() {
System.out.println("纯猪肉");
}
}
package cn.xuhaixing.decorator;
/**
* 装饰者的父类
* @author xuhaixing
*
*/
public abstract class DecMeat extends Meat {
@Override
public abstract void makeMeat();
}
package cn.xuhaixing.decorator;
/**
* 装饰者1
* @author xuhaixing
*
*/
public class KaoMeat extends DecMeat {
private Meat meat;
public KaoMeat(Meat meat) {
this.meat = meat;
}
@Override
public void makeMeat() {
System.out.println("烤");
meat.makeMeat();
}
}
package cn.xuhaixing.decorator;
/**
* 装饰者2
* @author xuhaixing
*
*/
public class ZhengMeat extends DecMeat {
private Meat meat;
public ZhengMeat(Meat meat) {
this.meat = meat;
}
@Override
public void makeMeat() {
System.out.println("蒸");
meat.makeMeat();
}
}
package cn.xuhaixing.decorator;
public class MainTest {
public static void main(String[] args) {
//原生猪
Meat pig = new PigMeat();
pig.makeMeat();
System.out.println("-----------------");
//烤的猪肉
Meat kaoPig = new KaoMeat(pig);
kaoPig.makeMeat();
System.out.println("------------------");
//蒸的猪肉
Meat zhengPig = new ZhengMeat(pig);
zhengPig.makeMeat();
System.out.println("------------------");
//综合猪肉,装饰者变成了被装饰者
Meat kaozhengPig = new ZhengMeat(kaoPig);
kaozhengPig.makeMeat();
}
}
运行结果如下,再不改变原来类的基础上,对功能进行一层一层封装,比如说,玩游戏时英雄每加一个装备,什么防御/攻击就会提高,就是这个思想。