装饰者模式

来源:互联网 发布:筑业软件多少钱 编辑:程序博客网 时间:2024/06/14 15:11

装饰者模式

装饰模式有名包装(Wrapper)模式。装饰模式以对客户端透明的方式拓展对象的功能,是继承关系的一个替代方案 –《Java与模式》

  • 简单聊聊装饰模式

    所谓装饰模式指的是比如某一个具体实体类的功能实现对于现在我们来说,其实是有用的,或者换一个方式来说,就是这个实现我们是需要,但是有一个前提就是我们可能在某种程度上来说需要对现在已有的功能进行增强,这个时候我们可以选择装饰模式作为一种处理方式,而不是单纯的去选择使用一个具体的子类去继承原有类,然后重写我们需要增强的方法。

    将一个通俗的场景,现在我们有一个一杯红茶饮料,但是作为我来说,我希望这个红茶饮料是加冰的,也就是说我需要一杯冰红茶,对于冰红茶来说相比较于红茶,他就只是加了冰,在原来的红茶上进行增强,那么这个时候我们可以使用装饰者模式来实现这个场景。

    代码实现

    /**所有饮料的标准化定义*/public interface Drink {    /**打印出自己是什么饮料*/    void print();}public class Tea implements Drink {    @Override    public void print() {        System.out.println("我是一杯红茶");    }}public class IceDrink implements Drink {    private Drink drink;    public IceDrink(Drink drink) {        super();        this.drink = drink;    }    @Override    public void print() {        System.out.println("我现在正在加冰");        drink.print();    }}/**客户端*/public class Client {    public static void main(String[] args) {        Drink tea = new Tea();        IceDrink iceDrink = new IceDrink(tea);        iceDrink.print();    }}

    当然,我们这个时候来考虑一下使用继承的方式实现上面冰红茶的案例

    代码如下

    public interface Drink {    void print();}public class Tea implements Drink{    @Override    public void print() {        System.out.println("我是一杯茶");    }}public class IceTea extends Tea {    @Override    public void print() {        System.out.println("我正在加冰");        super.print();    }}public class Client {    public static void main(String[] args) {        IceTea iceTea = new IceTea();        iceTea.print();    }}

    这样确实也实现了这个冰红茶的案例,但是我们现在假设一个场景,现在不单只有红茶需要加冰,我现在需要对奶茶也加冰,那么你必须在编写一个奶茶的具体类去实现饮料的接口,然后还需要编写一个冰奶茶的具体子类去继承奶茶类,然后重新相应的方法,这样我们同样实现了这个功能,但是问题下一次假如需要再加一个具体的饮料呢?如此反复,我们可能需要添加大量的子类,然后在退回来自己分析一下,假如我们需要对冰的相关数据需要修改,比如说原来是加两块冰,现在是加三块冰,那么我需要修改所有的具体子类的关于冰的增强的实现。当然在这个地方之所以使用装饰者模式就是为了避免这样的情况的出现

0 0