设计模式学习—装饰者模式

1、什么是装饰者模式?

​ 装饰器设计模式的目的是动态地为对象附加额外的职责装饰器为扩展功能提供了一种灵活的方法来替代子类化。装饰器模式用于动态扩展对象的功能,而无需更改原始类源或使用继承。这是通过围绕实际对象创建一个称为装饰器的对象包装器来实现的。

2、场景分析

为了理解Decorator设计模式,让我们帮助比萨公司制作一个额外的计算器。用户可以要求为披萨添加额外的配料,我们的工作是使用系统添加配料并提高价格。这类似于在运行时向批萨对象添加额外的职责,装饰器设计模式适合于这种类型的需求。

3、代码实现

public interface Pizza {
    public String getDesc();
    public double getPrice();
}
public class SimplyVegPizza implements Pizza {
    @Override
    public String getDesc() {
        return "SimplyVegPizza (230)";
    }

    @Override
    public double getPrice() {
        return 230;
    }
}

decorator封装了需要增加哪些功能的对象,因此它需要实现相同的接口。下面是一个抽象装饰器类,它将被所有具体装饰器扩展。

public abstract class PizzaDecorator implements Pizza {
    @Override
    public String getDesc() {
        return "Toppings";
    }
}
public class GreenOlives extends PizzaDecorator {
    private final Pizza pizza;
    public GreenOlives(Pizza pizza){
        this.pizza = pizza;
    }
    @Override
    public String getDesc() {
        return pizza.getDesc()+", Green Olives (5.47)";
    }
    @Override
    public double getPrice() {
        return pizza.getPrice()+5.47;
    }
}
public class RomaTomatoes extends PizzaDecorator {
    private final Pizza pizza;

    public RomaTomatoes(Pizza pizza) {
        this.pizza = pizza;
    }

    @Override
    public String getDesc() {
        return pizza.getDesc() + ", Roma Tomatoes (5.20)";
    }

    @Override
    public double getPrice() {
        return pizza.getPrice() + 5.20;
    }
}
public class RomaTomatoes extends PizzaDecorator {
    private final Pizza pizza;

    public RomaTomatoes(Pizza pizza) {
        this.pizza = pizza;
    }

    @Override
    public String getDesc() {
        return pizza.getDesc() + ", Roma Tomatoes (5.20)";
    }

    @Override
    public double getPrice() {
        return pizza.getPrice() + 5.20;
    }
}
public class TestDecoratorPattern {
    public static void main(String[] args) {
        DecimalFormat dformat = new DecimalFormat("#.##");
        Pizza pizza = new SimplyVegPizza();
        pizza = new RomaTomatoes(pizza);
        pizza = new GreenOlives(pizza);
        pizza = new Spinach(pizza);
        System.out.println("Desc: " + pizza.getDesc());
        System.out.println("Price: " + dformat.format(pizza.getPrice()));
    }
}

4、何时使用装饰者模式?

1、动态透明地向单个对象添加职责,即不影响其他对象。

2、承担可以撤销的责任。

3、当子类扩展不切实际时。有时,可能存在大量独立扩展,并且会产生大量子类来支持每个组合。或者类定义可能是隐藏的,或者以其他方式不可用于子类化。

你可能感兴趣的:(设计模式学习—装饰者模式)