IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 2021年9月19日-设计模式之桥接模式 -> 正文阅读

[PHP知识库]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)桥接模式将事物的两方面的特征分离,提高了灵活性,减少了类的个数

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-09-20 15:33:56  更:2021-09-20 15:34:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 4:04:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计