装饰者模式
在不改变原有对象的基础之上,将功能附加到对象上。提供了比继承更有弹性的替代方案(扩展原有对象功能)。
这听起来和代理模式、适配器模式有些像,区别如下:
装饰者模式和代理模式
装饰者模式关注的是对象的动态添加功能。代理模式关注的是对对象的控制访问,对它的用户隐藏对象的具体信息。
装饰者模式和适配器模式
装饰者模式和被装饰的类要实现同一个接口,或者装饰类是被装饰的类的子类。 适配器模式和被适配的类具有不同的接口。
装饰者模式实例讲解
以煎饼果子为例,有原味的煎饼果子,但是我们可以加香肠、鸡蛋,甚至可以加两个鸡蛋。如果说要一个加5个鸡蛋4根香肠的煎饼果子,我们可能需要新建一个子类,但我们不想这样,就可以用装饰器模式。
首先是主要类:抽象煎饼果子类、不加鸡蛋、火腿等的原味煎饼果子实体类:
public abstract class ABattercake {
protected abstract String getDesc();
protected abstract int cost();
}
public class Battercake extends ABattercake {
@Override
protected String getDesc() {
return "煎饼";
}
@Override
protected int cost() {
return 8;
}
}
然后是装饰类,包括装饰父类、鸡蛋装饰类、香肠装饰类。
装饰父类:
public class AbstractDecorator extends ABattercake {
private ABattercake aBattercake;
public AbstractDecorator(ABattercake aBattercake) {
this.aBattercake = aBattercake;
}
@Override
protected String getDesc() {
return this.aBattercake.getDesc();
}
@Override
protected int cost() {
return this.aBattercake.cost();
}
}
鸡蛋装饰类:
public class EggDecorator extends AbstractDecorator {
public EggDecorator(ABattercake aBattercake) {
super(aBattercake);
}
@Override
protected String getDesc() {
return super.getDesc()+" 加一个鸡蛋";
}
@Override
protected int cost() {
return super.cost()+1;
}
}
香肠装饰类:
public class SausageDecorator extends AbstractDecorator{
public SausageDecorator(ABattercake aBattercake) {
super(aBattercake);
}
@Override
protected String getDesc() {
return super.getDesc()+" 加一根香肠";
}
@Override
protected int cost() {
return super.cost()+2;
}
}
测试类:
public class DecoratorV2Test {
public static void main(String[] args) {
ABattercake aBattercake;
aBattercake = new Battercake();
aBattercake = new EggDecorator(aBattercake);
aBattercake = new EggDecorator(aBattercake);
aBattercake = new SausageDecorator(aBattercake);
System.out.println(aBattercake.getDesc()+" 销售价格:"+aBattercake.cost());
}
}
结果为:
煎饼 加一个鸡蛋 加一个鸡蛋 加一根香肠 销售价格:12
在java中的应用:IO流
链接:https://www.jianshu.com/p/4a530a3c70af