设计模式(七):桥接模式Bridge(结构型模式)
2016-07-18 11:30
645 查看
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
一. 适用性
1.你不希望在抽象和它的实现部分之间有一个固定的绑定关系。
例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。
2.类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。
这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
3.对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。
4.(C++)你想对客户完全隐藏抽象的实现部分。在C++中,类的表示在类接口中是可见的
有许多类要生成。这样一种类层次结构说明你必须将一个对象分解成两个部分。Rumbaugh 称这种类层次结构为“嵌套的普化”(nested generalizations )。
5.你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。一个简单的例子便是Coplien 的String 类[ C o p 9 2 ],在这个类中多个对象可以共享同一个字符串表示(S t r i n g R e p )。
二.参与者
1.Abstraction
定义抽象类的接口。
维护一个指向Implementor类型对象的指针。
2.RefinedAbstraction
扩充由Abstraction定义的接口。
3.Implementor
定义实现类的接口,该接口不一定要与Abstraction的接口完全一致。
事实上这两个接口可以完全不同。
一般来讲,Implementor接口仅提供基本操作,而Abstraction则定义了基于这些基本操作的较高层次的操作。
4.ConcreteImplementor
实现Implementor接口并定义它的具体实现。
三.实例
结果:
形象比喻:摘自网络
BRIDGE—早上碰到MM,要说早上好,晚上碰到MM,要说晚上好;碰到MM穿了件新衣服,要说你的衣服好漂亮哦,碰到MM新做的发型,要说你的头发好漂亮哦。不要问我“早上碰到MM新做了个发型怎么说”这种问题,自己用BRIDGE组合一下不就行了
桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。
一. 适用性
1.你不希望在抽象和它的实现部分之间有一个固定的绑定关系。
例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。
2.类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。
这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
3.对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。
4.(C++)你想对客户完全隐藏抽象的实现部分。在C++中,类的表示在类接口中是可见的
有许多类要生成。这样一种类层次结构说明你必须将一个对象分解成两个部分。Rumbaugh 称这种类层次结构为“嵌套的普化”(nested generalizations )。
5.你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。一个简单的例子便是Coplien 的String 类[ C o p 9 2 ],在这个类中多个对象可以共享同一个字符串表示(S t r i n g R e p )。
二.参与者
1.Abstraction
定义抽象类的接口。
维护一个指向Implementor类型对象的指针。
2.RefinedAbstraction
扩充由Abstraction定义的接口。
3.Implementor
定义实现类的接口,该接口不一定要与Abstraction的接口完全一致。
事实上这两个接口可以完全不同。
一般来讲,Implementor接口仅提供基本操作,而Abstraction则定义了基于这些基本操作的较高层次的操作。
4.ConcreteImplementor
实现Implementor接口并定义它的具体实现。
三.实例
package com.zoey.designPattern.Bridge; public abstract class WardrobeMaker { abstract public void produce(); }
package com.zoey.designPattern.Bridge; /* * 衣柜 */ public abstract class Wardrobe { //衣柜厂商 protected WardrobeMaker wardrobeMaker; //放置衣物 abstract public void placeClothing(WardrobeMaker wardrobeMaker); }
package com.zoey.designPattern.Bridge; public class BigMaker extends WardrobeMaker { public BigMaker(){ System.out.println("big厂商"); } @Override public void produce() { System.out.println("big厂商"); } }
package com.zoey.designPattern.Bridge; public class BigWardrobe extends Wardrobe { @Override public void placeClothing(WardrobeMaker wardrobeMaker) { System.out.println("一个big衣柜"); } }
package com.zoey.designPattern.Bridge; public class SmallMarker extends WardrobeMaker { public SmallMarker(){ System.out.println("small厂商"); } @Override public void produce() { System.out.println("small厂商"); } }
package com.zoey.designPattern.Bridge; public class SmallWardrobe extends Wardrobe { @Override public void placeClothing(WardrobeMaker wardrobeMaker) { System.out.println("一个small衣柜"); } }
package com.zoey.designPattern.Bridge; public class Test { public static void main(String[] args) { BigWardrobe bw = new BigWardrobe(); bw.placeClothing(new BigMaker()); SmallWardrobe sw = new SmallWardrobe(); sw.placeClothing(new SmallMarker()); } }
结果:
big厂商 一个big衣柜 small厂商 一个small衣柜
形象比喻:摘自网络
BRIDGE—早上碰到MM,要说早上好,晚上碰到MM,要说晚上好;碰到MM穿了件新衣服,要说你的衣服好漂亮哦,碰到MM新做的发型,要说你的头发好漂亮哦。不要问我“早上碰到MM新做了个发型怎么说”这种问题,自己用BRIDGE组合一下不就行了
桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。
相关文章推荐
- Hdu 5718 Oracle【贪心】
- 面试 腾讯 阿里 百度
- SQLite使用
- iOS-上传 包的时候 提示 Redundant binary upload
- eclipse Find/Replace
- 【转-整理】win764bit plsql 登录oracle11g ora-12154 问题汇总
- mysql联表查询语句示例
- css垂直居中的方法
- replaceScene 和 pushScene及其popScene引用计数变化详解
- HTML文字与段落
- IO模式 select、poll、epoll详解
- 成为优秀程序员的十个Tips
- informix数据库 java 增删改查
- 时间操作
- hdu-5719 Arrange(组合数学)
- mysql如何判断指定字段数据不重复
- Mysql查询缓存的注意事项
- 支付宝问题LaunchServices: ERROR: There is no registered handler for URL scheme alipay
- Centos6.5下安装mysql5.6
- 自己瞎写的