设计模式-结构型-装饰模式

78 阅读1分钟

简介

装饰器模式是结构型模式的一种,其主要作用就是为一个对象动态地添加自责,举一个栗子:我们买煎饼果子,假设卖家只提供了一张面饼,而我们还需要蔬菜、鸡蛋、火腿肠等,如果我们只是按面向对象思想去做,此时我们需要设计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
    }
}