《设计模式之禅》-桥梁模式
桥梁模式也叫做桥接模式,是一种比较简单的模式
定义
将抽象和实现解耦,使得两者可以独立地变化
桥梁模式中的4个角色
Abstraction——抽象化角色
它的主要职责是定义出该角色的行为,同时保存一个队实现化角色的引用,该角色一般是抽象类
Implementor——实现化角色
它是接口或者抽象类,定义角色必须的行为和属性
RefinedAbstraction——修正抽象化角色
它引用实现化角色对抽象化角色进行修正
ConcreteImplementor——具体实现化角色
它实现接口或抽象类定义的方法和属性
桥梁模式中的几个名词比较拗口,但是只要记住一句话就行:抽象角色引用实现角色,或者说抽象角色的部分实现是由实现角色完成的。
//实现化角色
public interface Implementor {//基本方法public void doSomething();public void doAnything();
}
//具体实现化角色
public class ConcreteImplementor implements Implementor {public void doSomething(){//业务逻辑处理}public void doAnything(){//业务逻辑处理}
}
//抽象化角色
public abstract class Abstraction {//定义对实现化角色的引用 private Implementor imp;//约束子类必须实现该构造函数public Abstraction (Implementor _imp){this.imp = _imp;}//获得实现化角色public Implementor getImp(){return imp;}//自身类的行为和属性public void request(){this.imp.doSomething();}}
增加构造函数是为了提醒子类,必须指定实现者,特别是已经明确了实现者,则尽量清晰明确地定义出来
//具体抽象化角色
public class RefinedAbstraction Abstraction extends Abstraction {//覆写构造函数public RefinedAbstraction(Implementor _imp){super(_imp);}//修正父类的行为@Overridepublic void request(){/** 业务处理...*/super.request();super.getImp().doAnything();}
}
//场景类
public class Client {public static void main(String[] args){//定义一个实现化角色Implementor imp = new ConcreteImplementor();//定义一个抽象化角色Abstraction abs = new RefinedAbstraction(imp);//执行abs.request();}
}
桥梁模式的优点
1.实现分离
这也是桥梁模式的主要特点,它完全是为了解决继承的缺点而提出的设计模式。在该模式下,实现可以不受抽象的约束,不用再绑定在一个固定的抽象层次上
2.优秀的扩充能力
只要对外暴露的接口层允许的变化,就可以随意增加实现或抽象
3.实现细节对客户透明
客户不用关心细节的实现,它已经由抽象层通过聚合关系完成了封装
使用场景
1.不希望或不适用使用继承的场景
例如继承层次过度,无法更细化设计颗粒等场景
2.接口或抽象类不稳定的场景
明知道接口不稳定还想通过实现或继承来实现业务需要,那是得不偿失的,也是比较失败的做法
3.重用性要求比较高的场景
设计的颗粒度越细,则被重用的可能性就越大,而采用继承则受父类的限制,不可能出现太细的颗粒度
注意事项
桥梁模式的意图还是对变化的封装,尽量把可能变化的因数封装到最细、最小的逻辑单元中,避免风险扩散,因此当发现类的继承有N层时,则可以考虑使用桥梁模式
最佳实践
继承的优点有很多,可以把公共的方法或属性抽取,父类封装共性,子类实现特性,但是继承的缺点也很明显,就是强入侵,父类有一个方法,子类也必须有这个方法,这是不可选择的,这会带来扩展性的问题
例子:
Father类有一个方法A,Son继承了这个方法,GrandSon也继承了这个方法,当有一天Son要重写父类这个方法,但是GrandSon也用了父类的这个方法,如果修改了,则要修改Son和GrandSon之间的关系,这样风险太大了
而桥梁模式则可以解决这个问题,Father把可能变化的方法放出去,Son子类想要拥有这个方法,就搭个桥梁,这个也不会影响GrandSon类。即使不使用也没有关系,因为这不是继承方法
对于比较明确不发生的,则通过继承来完成,若不能确定是否会发生变化,那就认为是会发生变化的,则通过桥梁模式来解决
设计模式之禅电子版
链接:https://pan.baidu.com/s/1JFuu7MU9qESKqOOCl-fQcQ
提取码:uh46
没有写迭代器模式,因为javaApi里已经实现了,项目中很少自己实现迭代器了
详情在第20章迭代器模式
《设计模式之禅》-桥梁模式相关推荐
- 设计模式之略见一斑(桥梁模式bridge)
桥梁模式的宗旨就是将抽象部分与它的实现部分分离,使它们都可以独立的变化 如下图所示: 你不希望在抽象和它的实现部分之间有一个固定的绑定关系.例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或 ...
- 设计模式之禅-代理模式
目录 代理模式 例子 定义 优点 使用场景 扩展 普通代理 强制代理 代理的个性-增强 动态代理 代理模式 例子 public interface IGamePlayer {/*** 登录游戏*/vo ...
- 设计模式之禅——模板方法模式(Template Method Pattern)
1.基本概念 Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Templa ...
- 设计模式之禅-访问者模式
目录 访问者模式 例子 定义 优点 缺点 使用场景 扩展 统计功能 多个访问者 双分派 最佳实践 访问者模式 例子 员工信息,获取不同类型员工的信息. public interface IVisito ...
- 设计模式之禅-策略模式
1 策略模式有点类似状态模式,不过策略的调用链切换是固定的. A A can not do -> B B can not do -> C do 2 代码 #include <ios ...
- 设计模式之禅-命令模式
目录 命令模式 例子 定义 优点 缺点 使用场景 扩展 增加需求 回滚 完美的Command 命令模式 例子 外包甲方项目..刚开始,客户(也就是旅行社,甲方)很乐意和我们每个组探讨,比如和需求组讨论 ...
- 设计模式之禅——门面模式
门面模式[Facade Pattern]也叫外观模式,是一种比较常用的封装模式,其定义如下: [要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行.门面模式提供一个高层次的接口,使得子系统更 ...
- 读设计模式之禅--策略模式
定义:定义一组算法,将每个算法都封装起来,并且使它们之间可以互换. package design.Strategy;/*** @Author: hyh* @Date: 2021/8/19 14:04* ...
- 设计模式之禅——策略模式(Strategy Pattern)
1.基本概念 在策略模式中,一个类的行为或算法可以在运行时更改.我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象.策略对象改变 context 对象的执行算法. 2. ...
- 读书 | 设计模式之禅 - 策略模式
文章目录 1. 引入策略模式 2. 策略模式定义 3. 策略模式的优点 1. 引入策略模式 智谋无敌的诸葛亮,在刘备去东吴招亲之前,特授以伴郎赵云三个锦囊,说是按天机拆开解决棘手问题. 这三个妙计分别 ...
最新文章
- linux6.6系统安装,CentOS6.6系统怎么安装
- python的垃圾回收机制和析构函数__del__
- python 链表 【测试题】
- java当中日期类的相关操作(学习笔记)
- SpringCloud——服务网关
- 例2.11 FatMouse' Trade - 九度教程第21题(贪心算法)
- HQL左外连接及排序
- 动态加载Web Service
- FreeFileSync 文件夹比较与同步软件
- 苹果ttc转ttf_iOS使用自定义字体的方法(内置和任意下载ttf\otf\ttc字体文件)
- 合并报表编制采用的理论_谈合并报表的编制理论
- IPv6实验5:IPv4到IPv6的过渡
- 201671010448 词频统计软件项目报告
- 股市修仙传:群魔乱舞之仙人跳!
- mybatis当传入数据类型为Int时并且值为0时,会判断为空字符串
- flask 蓝本(blueprint)
- linux ip rcv,【linux网络】ip_rcv()函数
- vue3+vite assets动态引入图片的几种方式,解决打包后图片路径错误不显示的问题
- 让自己的app支持小程序
- Python实现问卷星调查问卷自动填写