【编程素质】设计模式-装饰模式(Decorator,包装模式Wrapper)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunshineTan/article/details/82708786

1,概念

是动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

是以对客户端透明的方式扩展对象的功能,换句话说,客户端不会察觉到装饰前与装饰后有什么不同。

在不修改底层代码情况下,给对象赋予新的职责。

2,场景(处于安全目的,保护被访问者)

现在有一个对象,我们想给他增加方法或者属性,怎么去做,并且可以随意修改增加方法和属性的顺序。

I/O、过滤器。

3,注意

①装饰者和被装饰对象有相同的超类型。
因为装饰者必须能取代被装饰者。
②可以有多个装饰者。
③装饰模式输出的过程就像拆包,拆开每一个装饰者内容。

4,优缺点

1)优

让算法的变化独立于使用算法的客户。

2)缺

造成设计中有大量的小类。
装饰者在实例化组件时,将增加代码复杂度。(不只需要实例化组件,还要把此组件包装进装饰者中)。

5,经典用例:

java.io类:
这里写图片描述
例子:用BufferedReader修饰InputStreamReader对象:

BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

6,实现

由4部分组成:
①抽象接口
②具体组件(要接收附加责任的类)
③抽象装饰者
④具体装饰者(给接口对象添加附加责任)
这里写图片描述

package decorator;

public class Main {

    public static void main(String args[]){

        Beverage beverage = new Espresso();     
        System.out.println("订一杯Espresso,不要调料");
        System.out.println(beverage.getDescription()
                + "$" + beverage.cost());
        System.out.println("-------------");

        System.out.println("订一杯HouseBlend");
        Beverage beverage2 = new HouseBlend();
        System.out.println("加调料:Mocha装饰它");
        beverage2 = new Mocha(beverage2);
        System.out.println("加调料:Mocha装饰它");
        beverage2 = new Mocha(beverage2);
        System.out.println("加调料:Whip装饰它");
        beverage2 = new Whip(beverage2);
        System.out.println(beverage2.getDescription()
                + "$" + beverage2.cost());
    }
}
package decorator;
/**
 * 抽象组件
 * 饮料超类:接口(也可以用抽象类替代)
 * @author luo
 *
 */
public interface Beverage {

    public double cost();
    public String getDescription();

}
package decorator;

/**
 * 抽象装饰者
 * 调料类:抽象类
 * @author luo
 *
 */
public abstract class CondimentDeccorator implements Beverage{
    @Override
    public abstract String getDescription();
}
package decorator;

/**
 * 具体组件
 * 浓缩咖啡类
 * 
 * @author luo
 *
 */
public class Espresso implements Beverage {

    private String description = "Espresso";
    private double price = 1.2;

    @Override
    public double cost() {

        System.out.println("Espresso价格,1.2");
        return price;
    }

    @Override
    public String getDescription() {

        return description;
    }

}
package decorator;
/**
 * 具体组件
 * 一种饮料
 * @author luo
 *
 */
public class HouseBlend  implements Beverage {

    private String description = "HouseBlend Coffee";
    private double price = 1.5;

    @Override
    public double cost() {

        System.out.println("HouseBlend价格,1.5");
        return price;
    }

    @Override
    public String getDescription() {

        return description;
    }
}
package decorator;
/**
 * 摩卡类
 */
public class Mocha extends CondimentDeccorator{

    Beverage beverage;

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

    @Override
    public double cost() {

        System.out.println("Mocha调料,0.2");
        return .20 + beverage.cost();
    }

    @Override
    public String getDescription() {

        return beverage.getDescription() + ", Mocha";
    }
}
package decorator;

public class Whip extends CondimentDeccorator{

    Beverage beverage;

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

    @Override
    public double cost() {

        System.out.println("Whip调料,0.2");
        return .20 + beverage.cost();
    }

    @Override
    public String getDescription() {

        return beverage.getDescription() + ", Whip";
    }
}

猜你喜欢

转载自blog.csdn.net/SunshineTan/article/details/82708786