结构型模式:桥接模式
文章首发:
结构型模式:桥接模式
七大结构型模式之二:桥接模式。
简介
姓名 :桥接模式
英文名 :bridge pattern
价值观 :解耦靠我
个人介绍 :
decouple an abstraction from its implementation so that the two can vary independently.
将抽象和实现解耦,使得两者可以独立地变化。
(来自《设计模式之禅》)
你要的故事
现在手机二分天下,安卓手机和苹果手机目前占有率高居 98.45%,其中安卓手机占有率为 70.21%,苹果手机占有率为 28.24%,如下图所示。
(数据从 netmarketshare 来)
因为有这 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 浏览器
桥接模式代码已经写完。为什么叫桥接模式呢?因为它将打开软件的具体实现放到了软件实现里面,而不是放在了手机,通过聚合方式去调用软件打开的方法,这就像一条桥一样连接手机和软件。
总结
桥接模式利用了聚合的优点去解决继承的缺点,使得抽象和实现进行分离解耦。正由于解耦,使得有更好的扩展性,加手机类型或者加软件都非常容易,也不会破坏原有的代码。
推荐阅读
公众号后台回复『大礼包』获取 java、python、ios 等教程
加个人微信备注『教程』获取架构师、机器学习等教程