设计模式

装饰者模式(DecoratorPattern)

2018-01-26  本文已影响0人  jsjack_wang

1.定义

装饰者模式将职责附加在一个对象上,如果功能扩展,装饰者模式提供比继承更具弹性的替代方案

2.小栗子(咖啡店案例)

2.1 Coffee.java 咖啡抽象类
public abstract class Coffee {
    protected int price;
    protected String name;

    public int getPrice() {
        return this.price;
    }

    public String getName() {
        return this.name;
    }
}
2.2 SimpleCoffee.java 普通咖啡类
public class SimpleCoffee extends Coffee {
    @Override
    public int getPrice() {
        return 24;
    }

    @Override
    public String getName() {
        return "SimpleCoffee";
    }
}
2.3 DecoratorCoffee.java 装饰咖啡类
public class DecoratorCoffee extends Coffee {
    protected Coffee coffee;

    public DecoratorCoffee(Coffee coffee) {
        this.coffee = coffee;
    }

    @Override
    public int getPrice() {
        return this.coffee.getPrice();
    }

    @Override
    public String getName() {
        return this.coffee.getName();
    }
}
2.4 SugarCoffee.java 加糖咖啡类
public class SugarCoffee extends DecoratorCoffee {
    public SugarCoffee(DecoratorCoffee decoratorCoffee) {
        super(decoratorCoffee);
    }

    @Override
    public int getPrice() {
        return super.getPrice() + 2;
    }

    @Override
    public String getName() {
        return "Sugar + " + super.getName();
    }
}

3 测试类

public class DecoratorPatternDemo {
    public static void main(String[] args) {
        DecoratorCoffee decoratorCoffee = new SugarCoffee(new DecoratorCoffee(new SimpleCoffee()));
        System.out.println("NAME:" + decoratorCoffee.getName() + "  PRICE:" + decoratorCoffee.getPrice());
    }
}

4 总结

看到测试中的代码是不是有点似曾相识,不错java.io.*中,常常会用到类似的代码,其实也是用装饰者模式。它的装饰父类是FilterInputStream/FilterOutputStream,有空去看看流这一块的源码吧。
上一篇 下一篇

猜你喜欢

热点阅读