概述:将抽象部分与他的实现部分分离,这样抽象化与实现化解耦,使他们可以独立的变化.如何实现解耦的呢,就是通过提供抽象化和实现化之间的桥接结构.
应用场景
- 实现系统可能有多个角度分类,每一种角度都可能变化.
解释:桥接模式将继承模式转化成关联关系,他降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量.
理解抽象化,实现化,解耦
- 抽象化:将复杂物体的一个或几个共同的特性抽出去而只注意其他特性的行动或过程.在java面向对象中抽象化就是将对象的共同性质抽取出去形成类的过程.
- 实现化:针对抽象化给出的具体实现,它和抽象化是一个互逆的过程,实现化是对抽象化事物的进一步具体化.
- 解耦:解耦是将抽象化和实现化之间的耦合关系解脱开,或者说是将他们之间的强关联改换成弱关联.将两个角色之间的继承关系修改为关联关系.
优点
- 分离抽象接口及其实现部分.提高了比继承更好的解决方案.
- 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原来的系统.
- 实现细节对客户不透明,可以隐藏实现细节.
缺点
桥接模式的引入会增加系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行编程.
代码实现 示例:在开发中可能不止使用一种数据库, 例如Mysql,SqlServer数据库等,现在使用桥接模式创建一个连接数据库的驱动,然后对每一个数据库提供各自的实现.对于使用某一个数据库的时候只需要切换一下就行.
类图
数据库接口package Bridge; /** * Created by looper on 2017/8/16. */public interface Driver { public void connect();}复制代码
Mysql数据库实现类
package Bridge;/** * Created by looper on 2017/8/16. */public class MysqlDriver implements Driver { @Override public void connect() { System.out.println("连接Mysql数据库"); }}复制代码
SqlServer数据库实现类
package Bridge; /** * Created by looper on 2017/8/16. */public class SqlServerDriver implements Driver { @Override public void connect() { System.out.println("连接SQLServer数据库"); }}复制代码
桥梁类(抽象类)
package Bridge; /** * Created by looper on 2017/8/16. */public abstract class Bridge { private Driver driver; public void connect(){ driver.connect(); } public void setDriver(Driver driverTemp){ this.driver = driverTemp; } public Driver getDriver(){ return this.driver; }}复制代码
桥梁类(实现类)
package Bridge; /** * Created by looper on 2017/8/16. */public class MyBridge extends Bridge { }复制代码
测试类
package Bridge; /** * Created by looper on 2017/8/16. */public class BridgeTest { public static void main(String[] args) { Bridge mysqlBridge = new MyBridge(); Driver mysqlDriver = new MysqlDriver(); mysqlBridge.setDriver(mysqlDriver); mysqlBridge.connect(); Driver sqlServerDriver = new SqlServerDriver(); mysqlBridge.setDriver(sqlServerDriver); mysqlBridge.connect(); }}复制代码
输出:
桥接模式与适配器模式在代码实现上是相同的。差别在于适配器模式是已经有一个进水管和家用水龙头存在了,这时候生产一个接头来连接进水管和水龙头,这个接头就是适配器。桥接是定下生产接头策略,再让进水管有开发的自由度。只是先后的问题。note:见者易,学者难;莫将容易得,便作等闲看