装饰者模式
interface Liquid{
void drink();
}
定义一个液体接口,能喝的哦
class Water implements Liquid{
public void drink(){
// 我们不生产水,我们只是大自然的搬运工
}
}
纯净水
class LiquidDecortor implements Liquid{
private Liquid liquid;//被装饰的主体
public LiquidDecortor(Liquid liquid){
this.liquid = liquid;
}
public void drink(){
liquid.drink();//实际调用的是主体的喝方法
}
}
抽象装饰类
class Coffee extends LiquidDecortor{
public Coffee(Liquid liquid){
super(liquid);
}
public void drink(){
super.drink();
other taste//咖啡啥子味道自行脑补,就是添加了新的味道,扩充了液体只能喝的功能。虽然还是喝但是喝出来coffee的味道
}
public void otherMethods(){
//半透明装饰模式,不仅仅是增强了原本接口规范的功能,还新增了另外功能,比如咖啡能壮阳(别听我瞎比比)
}
}
咖啡类,扩展了喝的功能,添加了点味道
class Milk extends LiquidDecortor{
public Milk(Liquid liquid){
super(liquid);
}
public void drink(){
super.drink();
other taste//牛奶会有奶香味
}
public void otherMethods(){
//半透明装饰模式,不仅仅是增强了原本接口规范的功能,还新增了另外功能,比如牛奶帮助睡眠
}
}
牛奶类,扩展了喝的功能,添加了点奶味
class Client{
public static void main(String[] args){
Liquid liquid,milk;
liquid = new Water();
milk = new Milk(liquid);
milk.drink();//喝牛奶 透明装饰者模式
///////////////////////华丽分割线
Milk superMilk = new Milk(liquid);
superMilk.drink();//还是喝牛奶
superMilk.otherMethods();//其他功能,促睡眠,长个子,呵呵呵等
}
}
客户端
个人总结
装饰者模式是为了增强功能以及扩展新功能,这和java的继承功能重合。相比之下,装饰者模式更加灵活。对于一个需要被扩展功能的对象来说(被装饰类)可以动态的去选择适合自己想要的装饰类来完成功能的加强或者添加新功能。