2021年9月19日-设计模式之桥接模式

第十章:桥接模式

一、问题引入

在这里插入图片描述

现奶茶店有上述多种奶茶(实际情况可能更多),如果需要我们设计一个点奶茶的程序,传统的方案如上图所示,采用继承的方式,让每一种奶茶都对应一个子类。问题也显然一见,这样做会导致类爆炸。

我们看到,一杯奶茶主要有两个特点,即尺寸和所加的配料,这两个特点相乘就导致了很多的类,所以为了减少类的数量,我们将这两个特点拆成两种类。将奶茶的尺寸作为桥接类(两个特点最后当然要组合起来才能构成一杯具体的奶茶,所以两个特点类必有一个桥接类)。

二、桥接模式

类图如下:

在这里插入图片描述

MilkyTea 抽象类

public abstract class MilkyTea {
    protected Ingredient ingredient;

    public MilkyTea(Ingredient ingredient) {
        this.ingredient = ingredient;
    }

    public abstract void addTea();

    public abstract void addWater();

    public abstract void addMilk();

    public abstract void addSuger();

    public abstract void getInfo();

    public void makeMilkyTea() {
        addTea();
        addWater();
        addMilk();
        addSuger();
        ingredient.addIngredient();
        getInfo();
    }
}

MilkyTea 子类

public class BigMilkyTea extends MilkyTea {
    public BigMilkyTea(Ingredient ingredient) {
        super(ingredient);
    }

    @Override
    public void addTea() {
        System.out.println("加大量茶叶");
    }

    @Override
    public void addWater() {
        System.out.println("加大量水");
    }

    @Override
    public void addMilk() {
        System.out.println("加大量牛奶");
    }

    @Override
    public void addSuger() {
        System.out.println("加大量糖");
    }

    @Override
    public void getInfo() {
        System.out.println("大杯"+ ingredient.getInfo() +"奶茶");
    }


}
public class MediumMilkyTea extends MilkyTea {
    public MediumMilkyTea(Ingredient ingredient) {
        super(ingredient);
    }

    @Override
    public void addTea() {
        System.out.println("加一些茶叶");
    }

    @Override
    public void addWater() {
        System.out.println("加一些水");
    }

    @Override
    public void addMilk() {
        System.out.println("加一些牛奶");
    }

    @Override
    public void addSuger() {
        System.out.println("加一些糖");
    }

    @Override
    public void getInfo() {
        System.out.println("中杯" + ingredient.getInfo() + "奶茶");
    }
}
public class SmallMilkyTea extends MilkyTea {
    public SmallMilkyTea(Ingredient ingredient) {
        super(ingredient);
    }

    @Override
    public void addTea() {
        System.out.println("加少许茶叶");
    }

    @Override
    public void addWater() {
        System.out.println("加少许水");
    }

    @Override
    public void addMilk() {
        System.out.println("加少许牛奶");
    }

    @Override
    public void addSuger() {
        System.out.println("加少许糖");
    }

    @Override
    public void getInfo() {
        System.out.println("小杯" + ingredient.getInfo() + "奶茶");
    }
}

Ingredient 接口

public interface Ingredient {
    void addIngredient();

    String getInfo();
}

Ingredient 接口实现类

public class CoconutIngredient implements Ingredient {
    @Override
    public void addIngredient() {
        System.out.println("加一些椰果");
    }

    @Override
    public String getInfo() {
        return "椰果";
    }
}
public class PearlIngredient implements Ingredient {
    @Override
    public void addIngredient() {
        System.out.println("加一些珍珠");
    }

    @Override
    public String getInfo() {
        return "珍珠";
    }
}

测试类

public class BridgeTest {
    public static void main(String[] args) {
        MediumMilkyTea mediumMilkyTea = new MediumMilkyTea(new CoconutIngredient());
        mediumMilkyTea.makeMilkyTea();

        System.out.println("====================");

        BigMilkyTea bigMilkyTea = new BigMilkyTea(new PearlIngredient());
        bigMilkyTea.makeMilkyTea();
    }
}


/***** output *****
加一些茶叶
加一些水
加一些牛奶
加一些糖
加一些椰果
中杯椰果奶茶
====================
加大量茶叶
加大量水
加大量牛奶
加大量糖
加一些珍珠
大杯珍珠奶茶
******************/

这样我们仅使用了 7 个类就解决了问题,而且既符合单一职责原则,又符合合成复用原则

三、桥接总结

1)桥接模式需要正确识别出系统中两个独立变化的维度,所以使用范围有一定局限性

2)桥接模式将事物的两方面的特征分离,提高了灵活性,减少了类的个数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值