8.装饰者模式

动态的将新功能附加到对象上

实例

 

 

 最基础的抽象类Drink

/**
 * @author wuyimin
 * @create 2021-07-26 17:14
 * @description 饮料的抽象类 包含描述,价格以及子类计算总价的方法
 */
public abstract class Drink {
    private int price;
    private String info;
    protected abstract int cost();
    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }
}

咖啡类和添加物类都继承了Drink类,不同的是咖啡类继承后仅仅重写了cost方法,而添加物类使用聚合引入了一个drink类的对象,重写了cost和getinfo方法

咖啡类:

/**
 * @author wuyimin
 * @create 2021-07-26 17:18
 * @description 咖啡类继承了饮料类
 */
public class Coffee extends Drink {
    //它的cost方法仅仅是返回drink的价格
    @Override
    protected int cost() {
        return super.getPrice();
    }
}

添加物类:

/**
 * @author wuyimin
 * @create 2021-07-26 17:24
 * @description 添加类
 */
public class Decorator extends Drink {
    private Drink drink;//聚合
    public Decorator(Drink drink){
        this.drink=drink;
    }
    @Override
    protected int cost() {
        //获得原来咖啡的价格+添加物的价格
        return super.getPrice()+drink.cost();
    }

    @Override
    public String getInfo() {
        return super.getInfo()+super.getPrice()+"--"+drink.getInfo();
    }
}

实现类,实现类的作用主要就是为了设置每个物品的价格和描述

/**
 * @author wuyimin
 * @create 2021-07-26 17:19
 * @description A和B实现类的功能是设置信息和价格
 */
public class CoffeeA extends Coffee {
    CoffeeA(){
        setInfo("咖啡A");
        setPrice(1);
    }
}

/**
 * @author wuyimin
 * @create 2021-07-26 17:19
 * @description A和B实现类的功能是设置信息和价格
 */
public class CoffeeB extends Coffee {
    CoffeeB(){
        setInfo("咖啡B");
        setPrice(2);
    }
}

/**
 * @author wuyimin
 * @create 2021-07-26 17:30
 * @description 第一种调味品
 */
public class DecoratorA extends Decorator {
    public DecoratorA(Drink drink) {
        super(drink);//使用父类Decorator的构造器方法
        setPrice(1);
        setInfo("调味品A");
    }
}

/**
 * @author wuyimin
 * @create 2021-07-26 17:30
 * @description 第二种调味品
 */
public class DecoratorB extends Decorator {
    public DecoratorB(Drink drink) {
        super(drink);
        setPrice(2);
        setInfo("调味品B");
    }
}

桥接模式和装饰者模式的区别

第一种说法

装饰器模式用于动态地添加职责,原本的功能必须执行,对用户而言重要的是添加的职责

桥接模式用于抽象和实现的分离,即从不同维度划分类的属性,以聚合的方式桥接,降低耦合。

第二种说法

1。桥接模式中所说的分离,其实是指将结构与实现分离(当结构和实现有可能发生变化时)或属性与基于属性的行为进行分离;而装饰者只是对基于属性的行为进行封闭成独立的类。

2。桥接中的行为是横向的行为,行为彼此之间无关联;而装饰者模式中的行为具有可叠加性,其表现出来的结果是一个整体,一个各个行为组合后的一个结果

第三种说法

区别:

1.没有装饰者和被装饰者的主次区别,桥接和被桥接者是平等的,不用继承自同一个父类。(即桥接可以互换)

2.桥接模式不用使用同一个接口;装饰模式用同一个接口装饰,接口在父类中定义。

相同点:

1.都可以处理类扩散的情况

 

以下情况使用Decorator模式(摘自《设计模式》):

• 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

• 处理那些可以撤消的职责。

• 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

 

 

 

/**
* @author wuyimin
* @create 2021-07-26 17:24
* @description 添加类
*/
public class Decorator extends Drink {
private Drink drink;//聚合
public Decorator(Drink drink){
this.drink=drink;
}
@Override
protected int cost() {
//获得原来咖啡的价格+添加物的价格
return super.getPrice()+drink.cost();
}

@Override
public String getInfo() {
return super.getInfo()+super.getPrice()+"--"+drink.getInfo();
}
}
posted @ 2021-07-26 17:07  一拳超人的逆袭  阅读(29)  评论(0编辑  收藏  举报