装饰器模式

   博客分类: 学习笔记 文章类型: 原创

装饰器模式

本文字数为 2203 字, 预计读完大约需要 7 分钟

装饰器模式

利用组合,将同类型的对象赋予另一个同类型的对象,达到装饰的目的 在不修改对象类型的情况下利用继承和组合动态增加对象的功能 继承是为了保证对象的类型,组合是为了扩展对象的功能

在Java的Io包里面大量运用了装饰器模式,比如下面这样代码:

InputStream is = new InputSteam(System.in);
BufferedInputStream bis = new BufferedInputStream(is);

下面是《Head First 设计模式》中的例子

定义装饰器和被装饰器的共同父类

/**
 * 所有装饰类和被装饰类的父类
 */
public abstract class Beverage {
    protected String description = "Unknown Beverage";

    public String getDescription() {
        return description;
    }

    public abstract double cost();
}

下面的两个类是被装饰的类

/**
 * 被装饰器类的一个子类
 */
public class Espresso extends Beverage {
    public Espresso() {
        description = "Espresso";
    }

    public double cost() {
        return 1.99;
    }
}
/**
 * 被装饰器类的一个子类
 */
public class HouseBlend extends Beverage {
    public HouseBlend() {
        description = "HouseBlend";
    }

    public double cost() {
        return .89;
    }
}

下面两个类是装饰器类,他们有一个父类和两个子类

/**
 * 所有装饰器的父类
 */
public abstract class CondimentDecorator  extends Beverage{
    protected Beverage beverage;

    public CondimentDecorator(Beverage beverage) {
        this.beverage = beverage;
    }

    public abstract String getDescription();
}

/**
 * 装饰类的子类
 */
public class Mocha extends CondimentDecorator {

    public Mocha(Beverage beverage) {
        super(beverage);
    }

    @Override
    public String getDescription() {
        return beverage.getDescription() + ", Mocha";
    }

    @Override
    public double cost() {
        // 自己的价格加上它装饰的饮料的价格
        return .20 + beverage.cost();
    }
}

/**
 * 装饰类的子类
 */
public class Whip extends CondimentDecorator {

    public Whip(Beverage beverage) {
        super(beverage);
    }

    @Override
    public String getDescription() {
        return beverage.getDescription() + ", Whip";
    }

    @Override
    public double cost() {
        // 自己的价格加上它装饰的饮料的价格
        return .45 + beverage.cost();
    }
}

测试

class Test {
    private static void testDecorator() {
        System.out.println("testDecorator:");
        // 创建被装饰对象
        Beverage beverage = new Espresso();
        System.out.println(beverage.getDescription() + " $" + beverage.cost());

        // 装饰对象
        beverage = new Mocha(beverage);
        beverage = new Mocha(beverage);
        beverage = new Whip(beverage);
        System.out.println(beverage.getDescription() + " $" + beverage.cost());


        //创建另一个被装饰对象
        Beverage beverage1 = new HouseBlend();
        System.out.println(beverage1.getDescription() + " $" + beverage1.cost());

        //装饰对象
        beverage1 = new Whip(beverage1);
        beverage1 = new Mocha(beverage1);
        beverage1 = new Whip(beverage1);
        System.out.println(beverage1.getDescription() + " $" + beverage1.cost());
    }
}

输出如下

testDecorator:
Espresso $1.99
Espresso, Mocha, Mocha, Whip $2.8400000000000003
HouseBlend $0.89
HouseBlend, Whip, Mocha, Whip $1.99
  • 上一篇:策略模式
  • 下一篇:观察者模式