【Java设计模式】简单学桥接模式——来杯大杯加奶不加糖咖啡
目录
说明
目标
实现方式
应用场景
其他链接
说明
结构型模式之一,其他还有适配器模式、装饰模式、组合模式、外观模式、享元模式、代理模式
目标
用抽象关联取代了多层继承,将类之间的静态继承关系转换为动态的对象组合关系
实现方式
说是咖啡店开张,大家都来捧个场。为了迎合顾客的口味,店里的咖啡有很多种料可以添加,这里简单地以加糖和加奶来举例。当然还有别的,这显然是多维的,可以有不同种排列组合,比如加奶不加糖,加糖不加奶等等。这就需要用桥接模式(Bridge Pattern)了:
/*** 桥接模式(这里有两个变化维度,咖啡的容量和口味,而且都需要独立变化。如果使用继承的方式,随着变化类就会急剧的增加)* 桥接模式用一种巧妙的方式处理多层继承存在的问题, 用抽象关联取代了多层继承,将类之间的静态继承关系转换为动态的对象组合关系* @author ZRH* @version 1.0.0* @date 2020/7/22*/
public class Bridge {public static void main(String[] args) {// 第三步:客户端调用// 点两杯加奶的大杯咖啡(通过使用桥接模式,就使得咖啡的容量和口味这两个维度可以独立变化,互不干扰)// 通过构造器传添加物,起桥接作用RefinedCoffee largeWithMilk = new LargeCoffee(new Milk());largeWithMilk.orderCoffee(2);largeWithMilk.checkQuality();// 点一杯加奶的大杯咖啡largeWithMilk = new LargeCoffee(new Sugar());largeWithMilk.orderCoffee(1);largeWithMilk.checkQuality();}
}/*** 第一步:创建抽象化部分:抽象化Abstraction* <p>** @author ZRH* @version 1.0.0* @date 2020-07-22*/
abstract class Coffee {/*** 添加配料*/protected ICoffeeAdditives additives;public Coffee(ICoffeeAdditives additives) {this.additives = additives;}/*** 咖啡下单* <p>** @param count* @author : ZRH* @version : 1.0.0* @date : 2020-07-22*/public abstract void orderCoffee(int count);
}/*** 下面是一个对抽象化修正的一个类,里面增加了一个品控的方法.RefinedAbstraction* <p>** @author ZRH* @version 1.0.0* @date 2020-07-22*/
abstract class RefinedCoffee extends Coffee {public RefinedCoffee(ICoffeeAdditives additives) {super(additives);}public void checkQuality() {Random ran = new Random();System.out.println(String.format("%s添加%s", additives.getClass().getSimpleName(), ran.nextBoolean() ? "太多" : "正常"));}
}class LargeCoffee extends RefinedCoffee {public LargeCoffee(ICoffeeAdditives additives) {super(additives);}/*** 下单大杯的咖啡* <p>** @param count* @author : ZRH* @version : 1.0.0* @date : 2020-07-22*/@Overridepublic void orderCoffee(int count) {additives.addSomething();System.out.println("下单大杯咖啡" + count + "杯");}}/*** 第二步:创建实现化部分*/
interface ICoffeeAdditives {/***添加配料* <p>* @author : ZRH* @version : 1.0.0* @date : 2020-07-22*/void addSomething();
}/*** 加奶*/
class Milk implements ICoffeeAdditives {@Overridepublic void addSomething() {System.out.println("加奶");}
}/*** 加糖*/
class Sugar implements ICoffeeAdditives {@Overridepublic void addSomething() {System.out.println("加糖");}
}
应用场景
- 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用
- JDBC驱动程序
- 转账分类: 网上转账,柜台转账,AMT转账
- 转账用户类型:普通用户,银卡用户,金卡用户
- 消息类型:即时消息,延时消息
- 消息分类:手机短信,邮件消息,QQ消息
其他链接
【Java设计模式】简单学工厂模式
【Java设计模式】简单学抽象工厂模式
【Java设计模式】简单学建造者模式
【Java设计模式】简单学单例模式
【Java设计模式】简单学原型模式
【Java设计模式】其他模式~
【Java设计模式】简单学桥接模式——来杯大杯加奶不加糖咖啡相关推荐
- 《Java设计模式》之桥接模式
Bridge模式的概念 Bridge 模式是构造型的设计模式之中的一个.Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任.它的主要特点是把抽象(abst ...
- JAVA设计模式初探之桥接模式
生活中的一个例子: 拿汽车在路上行驶的来说.既有小汽车又有公共汽车,它们都不但能在市区中的公路上行驶,也能在高速公路上行驶.这你会发现,对于交通工具(汽车)有不同的类型,它们所行驶的环境(路)也 ...
- 重学 Java 设计模式:实战桥接模式「多支付渠道(微信、支付宝)与多支付模式(刷脸、指纹)场景」
作者:小傅哥 博客:https://bugstack.cn - 编写系列原创专题文章 沉淀.分享.成长,让自己和他人都能有所收获!
- Java 设计模式之Bridge桥接模式
将抽象和具体实现两个维度分离,让他们独立发展,并且在抽象类里聚合一个具体实现,通过聚合替代继承,用于解决类爆炸的问题. 这种模式要求对系统的抽象的理解和设计难度都比较大. 例子: 这里要对花,气球等装 ...
- 【Java设计模式】简单学外观模式——万能遥控器
目录 说明 目标 实现方式 注意事项 其他链接 说明 结构型模式之一,其他还有适配器模式.桥接模式.组合模式.装饰模式.享元模式.代理模式 外观模式(Facade Pattern)通过定义一个一致的接 ...
- 【Java设计模式】简单学访问者模式——我的选择是,Yes
目录 说明 实现方式 优点 缺点 应用场景 其他链接 说明 行为型模式之一,其他还有命令模式.模板方法模式.迭代器模式.观察者模式.中介者模式.备忘录模式.解释器模式(Interpreter模式).状 ...
- 【Java设计模式】简单学解释器模式——加减乘除
目录 说明 实现方式 应用场景 其他链接 说明 行为型模式之一,其他还有命令模式.模板方法模式.访问者模式.观察者模式.中介者模式.备忘录模式.迭代器模式.状态模式.策略模式.职责链模式(责任链模式) ...
- Java设计模式之责任链模式(简单易懂)
前言: 责任链模式(Chain of Responsibility): 使多个对象都有机会处理同一请求,从而避免请求的发送者和接受者之间的耦合关系,每个对象都是一个处理节点,将这些对象连成一条链,并沿 ...
- Java设计模式(装饰者模式-组合模式-外观模式-享元模式)
Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...
最新文章
- Learn OpenGL (七):摄像机
- 旷视 IPO 在即,看清“AI 第一股”的商业真相
- 解决Mac Pro上IDEA卡顿的问题
- SQLITE中原子提交的实现
- python之Argparse模块
- Tomcat相关目录及配置文件总结
- 数据挖掘常用的方法(分类,回归、聚类、关联规则)
- python函数定义中参数列表里的参数是_python函数参数中的/和*是什么意思?
- CSDN 独家对话阿里云贾扬清、华先胜等大咖,剧透阿里云原生技术密码
- 档案盒正面标签制作_错题本科学制作方法、正确使用方式及窍门
- 信息学奥赛一本通 1013:温度表达转化 | OpenJudge NOI 1.3 08
- MySQL的索引类型及简单优化
- 马斯克说话还能算数吗?声称删除Twitter账号却依旧活跃
- php exif 扩展
- [置顶] 提高生产力:开源Java工具包Jodd(Java的”瑞士军刀”)
- 解决button多次重复点击
- redis key操作大全
- APEX 压枪练习记录
- 电影的幕布效果怎么做?
- 大学生面试:教你用“一切细节”征服HR