【结构型】Bridge模式
桥接模式是为了将对象的抽象与实现分离,使得它们可以独立变化。简简单单的一句话,却已经是站在了更高抽象层面上来看待、设计、解决问题。平常我们多是对具体问题进行分析、抽象,然后就开始设计,这对多数情况下基本完全够用,毕竟实际项目中的功能模块都是找一“最优解的"实现来解决掉问题,把功能设计出来即可。这种情况下的结构关系图参考如下:

这种抽象设计的缺点是:如果解决问题的方式不止一种,则必需为以上所有Concrete类都是实现对应的具体版本,这样不但类继承体系十分复杂,后期只要随便增加一种实现方式,都将要增加N个对应的新class。为解决这类问题,需要将问题的具体实现剥离出来单独抽象,并在问题抽象层面与实现抽象层面做个关联桥接即可。从而在问题抽象层面上,就不需要关心当前问题是如何被解决的(即:如何实现的)。改进后的类关系图(即:Bridge模式的类关系图参考如下):

从关系图中可看出,不论是日后增加新Target,还是扩展新实现方式,对于逻辑结构都不需要做调整,也不会因为扩展了新的实现而引起整个Target系列的动荡。模式的编码结构参考如下:
namespace bridge
{
class IImpl;
class ITarget
{
public:
virtual void doSomething() = ;
// some code here........ protected:
IImpl* getImpl() { return _impl; } private:
IImpl* _impl; };//class ITarget class ConcreteTarget : public ITarget
{
public:
virtual void doSomething() override {
auto pImpl = this->getImpl();
if (nullptr != pImpl) {
pImpl->realDoSomething();
}
// some other code here........
} };//class ConcreteTarget class IImpl
{
public:
virtual void realDoSomething() = ; };//class IImpl class ConcreteImpl1 : public IImpl
{
public:
virtual void realDoSomething() override { /* some code here........ */ } };//class ConcreteImpl1 class ConcreteImpl2 : public IImpl
{
public:
virtual void realDoSomething() override { /* some code here........ */ } };//class ConcreteImpl2 }//namespace bridge
Bridge模式编码结构参考
【结构型】Bridge模式的更多相关文章
- JAVA设计模式(09):结构型-代理模式(Proxy)
代理模式是经常使用的结构型设计模式之中的一个,当无法直接訪问某个对象或訪问某个对象存在困难时能够通过一个代理对象来间接訪问,为了保证client使用的透明性,所訪问的真实对象与代理对象须要实现同样的接 ...
- 结构型--代理模式(Proxy)
一.代理模式是什么? 代理模式属于GOF23设计模式中结构型中的设计模式,通过代理对象来屏蔽(部分或者屏蔽)对真实对象的直接访问,下图为UML图: 在代理模式中组件包括:抽象角色接口.代理角色类.真实 ...
- 结构型---桥接模式(Bridge Pattern)
定义 桥接模式即将抽象部分与实现部分脱耦,使它们可以独立变化.桥接模式的目的就是使两者分离,根据面向对象的封装变化的原则,我们可以把实现部分的变化封装到另外一个类中,这样的一个思路也就是桥接模式的实现 ...
- 结构型---组合模式(Composite Pattern)
组合模式的定义 组合模式允许你将对象组合成树形结构来表现”部分-整体“的层次结构,使得客户以一致的方式处理单个对象以及对象的组合. 组合模式实现的最关键的地方是——简单对象和复合对象必须实现相同的接口 ...
- 结构型---外观模式(Facade Pattern)
定义 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用.使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通 ...
- 结构型---代理模式(Proxy Pattern)
代理模式的详细介绍 代理模式按照使用目的可以分为以下几种: 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象.这个不同的地址空间可以是本电脑中,也可以在另一台电脑中.最典型 ...
- 设计模式之美:Structural Patterns(结构型模式)
结构型模式涉及到如何组合类和对象以获得更大的结构. 结构型类模式采用继承机制来组合接口实现. 结构型对象模式不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法. 因为 ...
- C#设计模式之十三代理模式(Proxy)【结构型】
一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是"结构型"设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字 ...
- C#设计模式之十二代理模式(Proxy Pattern)【结构型】
一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是“结构型”设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来看看.“代理”可以理 ...
- 结构型模式(七) 代理模式(Proxy)
一.动机(Motivate) 在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给使用者.或者系统结构带来很多麻烦.如何在不 ...
随机推荐
- COJ 0578 4019二分图判定
4019二分图判定 难度级别: B: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 给定一个具有n个顶点(顶点编号为0,1,… ...
- Java---多线程之死锁
★ 死锁的两种情况: 简单的说下单块cpu运行多线程的情况: 大家可能平时玩电脑,可以同时挂QQ啊,玩游戏啊,打开文本啊,等等.这里,我们假设是单块cpu.也就是俗称的单核cpu. 大家可能会觉得这些 ...
- c++ map 插入数据后,begin(),end()以及当前迭代器的变化
1. map.end()指向map的最后一个元素之后的地址,无论执行map.erase(iter)还是map.add(key, value),map.end()所返回的值永远不会发生变化,都是指向同一 ...
- php开启错误提示
1.在php.ini文件里加上下面两句 display_errors = Onerror_reporting = E_ALL | E_STRICT 2.在Apache的 httpd.conf文件里加上 ...
- android的intent打开系统程序
打开设置主界面 Intent intent = new Intent(Android.provider.Settings.ACTION_SETTINGS); //系统设置 startActivityF ...
- linux用户权限相关命令
1.创建组 groupadd test 修改组 groupmod -n test2 test 将名字改为test2 删除组 groupdel test 查看组 groups r ...
- Android Studio中解决Gradle DSL method not found: 'android()'
近期导入as的项目出了这种问题 这个问题困扰了我非常长时间,好吧,搜了半天全都是runProguard的.最后在stackoverflow上搜到解决的方法了: http://stackoverflow ...
- EasyUi DataGrid 绑定数据格式问题
如果显示汇总记录则需设置页脚属性:首先设置showFooter:true, 然后后台计算出合计数据,一起传过来,类似如下:{"total":28,"rows": ...
- json数据获取
今天Pei讲了一个android获取json数据的方式吧 代码什么的没看懂,反正知道就是那么一回事,用AsyncTask线程来获取json数据,我也不知道这样说对不对 估计以后回过来看的时候会发现一大 ...
- 仿写Windows7桌面和任务栏 HTML5+CSS3+Jquery实现
过去一段时间零零散散的自学了一点点jquery的相关用法,基本上属于用到哪个了,就去查然后就学一点,没有系统的学过,深入的用法也不是特别了解,毕竟javascript基础就比较薄弱.经过一段时间的零敲 ...