简介
装饰器模式是结构型模式的一种,其主要作用就是为一个对象动态地添加自责,举一个栗子:我们买煎饼果子,假设卖家只提供了一张面饼,而我们还需要蔬菜、鸡蛋、火腿肠等,如果我们只是按面向对象思想去做,此时我们需要设计7个类(面饼+蔬菜/鸡蛋/火腿肠、面饼+蔬菜&&鸡蛋/xxx、面饼+鸡蛋&&蔬菜&&火腿肠),这种加班显然是我们自找的,而且如果我们还需要增加一种材料比如肉松,则我们还要增加好几个类,这显然不利于项目的扩展性。装饰器模式最经典的应用莫过于JDK中IO流的实现。下面给出一个Demo。
Demo实现
1.首先定义煎饼的接口和其实现
public interface Pita {
String getDescription();
int getCost();
}
public class Jianbing implements Pita {
@Override
public String getDescription() {
return "Basic Jianbing";
}
@Override
public int getCost() {
return 5;
}
}
2.定义一个调料的抽象类,让鸡蛋类和火腿肠类去实现它
public abstract class Ingredient implements Pita{
}
public class Egg extends Ingredient{
private Pita pita;
public Egg(Pita pita) {
this.pita = pita;
}
@Override
public String getDescription() {
return this.pita.getDescription() + ", add egg";
}
@Override
public int getCost() {
return this.pita.getCost() + 1;
}
}
public class Sausage extends Ingredient{
private Pita pita;
public Sausage(Pita pita) {
this.pita = pita;
}
@Override
public String getDescription() {
return this.pita.getDescription() + ", add sausage";
}
@Override
public int getCost() {
return this.pita.getCost() + 2;
}
}
3.客户端调用
public class Test {
public static void main(String[] args) {
Pita pita = new Jianbing();
pita = new Egg(pita);
pita = new Sausage(pita);
System.out.println(pita.getDescription()); //Basic Jianbing, add egg, add sausage
System.out.println(pita.getCost());// 8
}
}