Structual设计--Bridge模式
2015-06-08 09:38
246 查看
1.意图
将抽象部分与它的实现部分分离,使他们都可以独立地变化。2.别名
Handle/Body3.动机
当一个抽象对象可能有多个实现时,通常用继承来协调它们。抽象类定义对该抽象的接口,而具体的子类则用不同方式加以实现。但是此方法有时不够灵活。继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立的进行修改、扩充和重用。4.适用性
以下情况使用Bridge模式:你不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。
类的抽象以及它的实现都应该可以通过生成子类的方式加以扩充。这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对他们进行扩充。
对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。
(c++)你想对客户完全隐藏抽象的实现部分。在C++中,类的表示在类接口中是可见的。
你想在多个对象间共享实现(可能使用引用计数),单同事要求客户并不知道这一点。
5.结构
桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化。桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时候,在各个数据库之间进行切换,基本不需要动太多的代码,甚至丝毫不用动,原因就是JDBC提供统一接口,每个数据库提供各自的实现,用一个叫做数据库驱动的程序来桥接就行了。我们来看看关系图:6.代码示例
实现代码:先定义接口:
[code]public interface Sourceable { public void method(); }
分别定义两个实现类:
[code]public class SourceSub1 implements Sourceable { @Override public void method() { System.out.println("this is the first sub!"); } } public class SourceSub2 implements Sourceable { @Override public void method() { System.out.println("this is the second sub!"); } }
定义一个桥,持有Sourceable的一个实例:
[code]public abstract class Bridge { private Sourceable source; public void method(){ source.method(); } public Sourceable getSource() { return source; } public void setSource(Sourceable source) { this.source = source; } } public class MyBridge extends Bridge { public void method(){ getSource().method(); } }
测试类:
[code]public class BridgeTest { public static void main(String[] args) { Bridge bridge = new MyBridge(); /*调用第一个对象*/ Sourceable source1 = new SourceSub1(); bridge.setSource(source1); bridge.method(); /*调用第二个对象*/ Sourceable source2 = new SourceSub2(); bridge.setSource(source2); bridge.method(); } }
output:
this is the first sub!
this is the second sub!
这样,就通过对Bridge类的调用,实现了对接口Sourceable的实现类SourceSub1和SourceSub2的调用。接下来我再画个图,大家就应该明白了,因为这个图是我们JDBC连接的原理,有数据库学习基础的,一结合就都懂了。
7.相关模式
Abstract Factory模式可以用来创建和配置一个特定的Bridge模式。Adapter模式用来帮助无关的类协同工作,它通常在系统设计完成后才会被使用。然而,Bridge模式则是在系统开始时就被使用,它使得抽象接口和实现部分可以独立进行改变。
引用:
http://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm
http://item.jd.com/10057319.html
/article/1354307.html
相关文章推荐
- 查询mysql当前连接数
- 代理模式
- Linux ACL权限
- java QQ客户端
- GO语言系列【连载GoRK3288】1.Rockchip RK3288, GO!GO!!GO!!!
- CSS 选择符
- Microsoft.Office.Interop.Word 创建word
- STL 排序算法之全排列sort和next_permutation
- php配置打开短标签
- QLPreviewController 展示TXT文本时中文乱码的解决方法
- HTML5: Screen Orientation API
- leetcode_64题——Minimum Path Sum(动态规划)
- .NET开源项目
- 模仿登陆,记住密码
- POJ 1003
- Android 解决系统大号字体导致布局显示错乱问题
- MySQL 数据库 数据表 编辑
- win7系统管理员被禁用了怎么办
- Java对象及内存管理
- 详细整理:UITableView优化技巧