文章首发:
结构型模式:桥接模式 <https://mp.weixin.qq.com/s/4QutG72rzNGxuZC7Xm1w5w>



七大结构型模式之二:桥接模式。

简介

姓名 :桥接模式

英文名 :Bridge Pattern

价值观 :解耦靠我

个人介绍 :
Decouple an abstraction from its implementation so that the two can vary
independently.
将抽象和实现解耦,使得两者可以独立地变化。
(来自《设计模式之禅》)

你要的故事

现在手机二分天下,安卓手机和苹果手机目前占有率高居 98.45%,其中安卓手机占有率为 70.21%,苹果手机占有率为 28.24%,如下图所示。


(数据从 netmarketshare
<https://netmarketshare.com/operating-system-market-share.aspx?options=%7B%22filter%22%3A%7B%22%24and%22%3A%5B%7B%22deviceType%22%3A%7B%22%24in%22%3A%5B%22Mobile%22%5D%7D%7D%5D%7D%2C%22dateLabel%22%3A%22Trend%22%2C%22attributes%22%3A%22share%22%2C%22group%22%3A%22platform%22%2C%22sort%22%3A%7B%22share%22%3A-1%7D%2C%22id%22%3A%22platformsMobile%22%2C%22dateInterval%22%3A%22Monthly%22%2C%22dateStart%22%3A%222018-04%22%2C%22dateEnd%22%3A%222019-03%22%2C%22plotKeys%22%3A%5B%7B%22platform%22%3A%22Android%22%7D%2C%7B%22platform%22%3A%22iOS%22%7D%2C%7B%22platform%22%3A%22Unknown%22%7D%2C%7B%22platform%22%3A%22Series%2040%22%7D%2C%7B%22platform%22%3A%22Windows%20Phone%20OS%22%7D%5D%2C%22segments%22%3A%22-1000%22%7D>
来)

因为有这 2 个系统,所以很多软件商都不得不开发 2 个系统的
APP。我们就拿这个案例来讲,目前手机有安卓手机和苹果手机,软件有谷歌浏览器和火狐浏览器,通过手机打开软件这一过程来讲讲桥接模式。

从个人介绍可见,需要抽象化和实现化,然后使用桥接模式将抽象和实现解耦。

抽象化:把一类对象共有的东西抽象到一个类里面,该类作为这类对象的基类。在这里我们可以抽象化的便是手机。

实现化:将接口或抽象类的未实现的方法进行实现。在这里我们可以实现化的就是软件。

将抽象和实现解耦:有了上面的抽象化和实现化,通过桥接模式来实现解耦。在这里,我们把打开软件 open() 放到软件实现中,而抽象的手机利用模板方法模式定义
openSoftware() 供手机子类去实现,手机子类也是调用软件的 open() 方法,并没有自己实现打开逻辑,也就是解耦了这个打开软件过程。

下面给出案例的代码。

Phone 手机抽象类代码。属性 system 代表系统名称,software 代表要打开的软件,openSoftware() 对外提供打开软件的方法。
abstract class Phone { private String system; private Software software;
public abstract void openSoftware(); public String getSystem() { return system;
} public void setSystem(String system) { this.system = system; } public
Software getSoftware() { return software; } public void setSoftware(Software
software) { this.software = software; } }
AndroidPhone 安卓系统手机代码。
class AndroidPhone extends Phone { public AndroidPhone(Software software){
this.setSystem("Android"); this.setSoftware(software); } @Override public void
openSoftware() { this.getSoftware().open(this); } }
IOSPhone IOS 系统手机代码(也就是苹果手机)。
class IOSPhone extends Phone { public IOSPhone(Software software) {
this.setSystem("IOS"); this.setSoftware(software); } @Override public void
openSoftware() { this.getSoftware().open(this); } }
Software 软件接口代码。它有一个方法 open(),用于打开该软件。
interface Software { void open(Phone phone); }
Chrome 谷歌浏览器软件代码。
class Chrome implements Software { @Override public void open(Phone phone) {
System.out.println("打开 " + phone.getSystem() + " 手机的 Chrome 浏览器"); } }
FireFox 火狐浏览器软件代码。
class FireFox implements Software { @Override public void open(Phone phone) {
System.out.println("打开 " + phone.getSystem() + " 手机的 Firefox 浏览器"); } }
测试代码如下。
public class BridgeTest { public static void main(String[] args) { Software
chrome = new Chrome(); Software firefox = new FireFox(); Phone androidPhone =
new AndroidPhone(chrome); androidPhone.openSoftware();
androidPhone.setSoftware(firefox); androidPhone.openSoftware(); Phone iosPhone
= new IOSPhone(chrome); iosPhone.openSoftware(); iosPhone.setSoftware(firefox);
iosPhone.openSoftware(); } } 打印结果: 打开 Android 手机的 Chrome 浏览器 打开 Android 手机的
Firefox 浏览器 打开 IOS 手机的 Chrome 浏览器 打开 IOS 手机的 Firefox 浏览器

桥接模式代码已经写完。为什么叫桥接模式呢?因为它将打开软件的具体实现放到了软件实现里面,而不是放在了手机,通过聚合方式去调用软件打开的方法,这就像一条桥一样连接手机和软件。

总结

桥接模式利用了聚合的优点去解决继承的缺点,使得抽象和实现进行分离解耦。正由于解耦,使得有更好的扩展性,加手机类型或者加软件都非常容易,也不会破坏原有的代码。

推荐阅读

结构型模式:适配器模式 <https://mp.weixin.qq.com/s/kahyfWIOo2jH4GONl3EUuQ>

行为型模式:访问者模式 <https://mp.weixin.qq.com/s/WPtBJa8eKiP2oSVzTsYk3w>

行为型模式:解释器模式 <https://mp.weixin.qq.com/s/o1RRn667-Tj1Qwe7Z15CsA>

公众号后台回复『大礼包』获取 Java、Python、IOS 等教程
加个人微信备注『教程』获取架构师、机器学习等教程


友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信