桥接模式:

将抽象部分和它的实现部分相分离开来,以使它们能够单独地变化。

UML图:

主要包含:

  1. Abstraction:定义了抽象部分的接口。操作一个实现部分对象的引用。

  2. RefinedAbstraction:继承自抽象部分的类。
  3. Implementor:实现部分的接口。
  4. ConcreteImplementor:实现了Implementor定义的接口的详细类。

C++代码例如以下:

#include <iostream>

using namespace std;

class Implementor
{
public:
virtual void operationImpl()=0;
}; class ConcreteImplementorA:public Implementor
{
public:
void operationImpl()
{
cout<<"ConcreteImplementorA::operationImpl"<<endl;
} }; class ConcreteImplementorB:public Implementor
{
public:
void operationImpl()
{
cout<<"ConcreteImplementorB::operationImpl"<<endl;
} }; class Abstraction
{
public:
virtual void operation()=0;
void setImplementor(Implementor * i)
{
impl=i;
}
Implementor * getImplementor()
{
return impl;
}
protected:
Implementor * impl;
}; class RefinedAbstraction:public Abstraction
{
public:
void operation()
{
impl->operationImpl();
}
}; int main()
{
cout<<"桥接模式样例"<<endl;
Abstraction * ab=new RefinedAbstraction();
Implementor * cia=new ConcreteImplementorA();
ab->setImplementor(cia);
ab->operation();
Implementor * cib=new ConcreteImplementorB();
ab->setImplementor(cib);
ab->operation();
delete cia;
delete cib;
delete ab;
return 0;
}

运行输出:


以下是一个详细的样例,看这个详细的样例可能好理解一些,摘自大话设计模式:

  1. Abstraction为Phone(手机)。
  2. RefinedAbstraction为Samsung(三星手机)。Huawei(华为手机)。
  3. Implementor为Game(手机游戏)。
  4. ConcreteImplementor为NeedForSpeed(极品飞车)。QQGame(QQ游戏),FruitNinjia(水果忍者)。

UML类图为:

C++代码:

#include <iostream>

using namespace std;

class Game
{
public:
virtual void play()=0;
}; class NeedForSpeed :public Game
{
public:
virtual void play()
{
cout<<"need for speed play"<<endl;
}
}; class QQGame :public Game
{
public:
virtual void play()
{
cout<<"QQGame play"<<endl;
}
}; class FruitNinjia:public Game
{
public:
virtual void play()
{
cout<<"Fruit Ninjia play"<<endl;
}
}; class Phone
{
public:
virtual void run()=0;
void setGame(Game *g)
{
game=g;
}
Game * getGame()
{
return game;
}
protected:
Game *game;
}; class Samsung:public Phone
{
public:
virtual void run()
{
cout<<"Samsung :";
game->play();
}
}; class HuaWei:public Phone
{
public:
virtual void run()
{
cout<<"HuaWei :";
game->play();
} }; int main()
{
cout<<"桥接模式真实的样例,不同的手机品牌和手机游戏"<<endl;
Phone *samsung=new Samsung();
Phone *huawei=new HuaWei();
Game * needForSpeed=new NeedForSpeed();
Game * qqGame=new QQGame();
Game * fruit=new FruitNinjia();
samsung->setGame(qqGame);
samsung->run();
huawei->setGame(needForSpeed);
huawei->run();
samsung->setGame(fruit);
samsung->run();
delete samsung;
delete huawei;
delete needForSpeed;
delete qqGame;
delete fruit;
return 0; }

运行输出:

设计模式之十八:桥接模式(Bridge)的更多相关文章

  1. 跟着实例学习设计模式(9)-桥接模式bridge(结构型)

    桥接模式属于结构型设计模式. 设计意图:将抽象部分与实现部分分离.使它们都能够独立的变化. 一看到设计意图,大家可能有些发懵,我们看到的继承和接口不都是抽象和实现分离的吗?尤其是接口和抽象类都是这种实 ...

  2. C#设计模式之十八状态模式(State Pattern)【行为型】

    一.引言 今天我们开始讲“行为型”设计模式的第六个模式,该模式是[状态模式],英文名称是:State Pattern.无论是现实世界,还是面向对象的OO世界,里面都有一个东西,那就是对象.有对象当然就 ...

  3. 二十四种设计模式:桥接模式(Bridge Pattern)

    桥接模式(Bridge Pattern) 介绍将抽象部分与它的实现部分分离,使它们都可以独立地变化. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,现在使这些操作的抽象 ...

  4. 【设计模式】桥接模式 Bridge Pattern

    开篇还是引用吕振宇老师的那篇经典的文章<设计模式随笔-蜡笔与毛笔的故事>.这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了. 现在市面上卖的蜡笔很多,各种型号, ...

  5. 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...

  6. 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...

  7. 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)

    原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...

  8. 命令模式 Command 行为型 设计模式(十八)

    命令模式(Command) 请分析上图中这条命令的涉及到的角色以及执行过程,一种可能的理解方式是这样子的: 涉及角色为:大狗子和大狗子他妈 过程为:大狗子他妈角色 调用 大狗子的“回家吃饭”方法 引子 ...

  9. python 设计模式之桥接模式 Bridge Pattern

    #写在前面 前面写了那么设计模式了,有没有觉得有些模式之间很类似,甚至感觉作用重叠了,模式并不是完全隔离和独立的,有的模式内部其实用到了其他模式的技术,但是又有自己的创新点,如果一味地认为每个模式都是 ...

  10. 桥接模式(Bridge Pattern)

    1,定义           桥接模式(Bridge Pattern),也称为桥梁模式,其用意是将抽象化与实现化脱耦,使得两者可以独立的变化,它可以使软件系统沿着多个方向进行变化,而又不引入额外的复杂 ...

随机推荐

  1. new Date在ios下的兼容bug

    今天发现在ios下new Date("2019-03-06").getTime()返回NaN 原因是ios下不支持“-”必须用"/" 记录备忘 var d = ...

  2. MySQL 5.7主从复制与主主复制实现细节分析

    0.简介: MySQL作为世界上使用最为广泛的数据库之一,免费是其原因之一.但不可忽略的是它本身的功能的确很强大.随着技术的发展,在实际的生产环境中,由单台MySQL数据库服务器不能满足实际的需求.此 ...

  3. iOS crash 崩溃问题的追踪方法

    http://www.cnblogs.com/easonoutlook/archive/2012/12/27/2835884.html iOS crash 崩溃问题的追踪方法 在调试程序的时候,总是碰 ...

  4. sublime text mac使用技巧

    工欲善其事,必先利其器 1.列选择 鼠标左键+OPTION 2.查找替换 COMMAND+OPTION+F 3.分屏 COMMAND+OPTION+数字,具体数字代表要分几个屏

  5. 浅浅地谈一下随机算法【poj2454】【poj3318】

    随机算法我也只是稍微接触了一下,就是想写篇博客自己稍微总结一下 其实随机算法也算是一个玄学吧,运气不好还是会wa.但是我们知道,计算机可以在短时间内计算大量的数据,所以碰到正确答案的概率还是挺大的. ...

  6. 五. 面向对象高级特性6. Java 泛型

    我们知道,使用变量之前要定义,定义一个变量时必须要指明它的数据类型,什么样的数据类型赋给什么样的值. 假如我们现在要定义一个类来表示坐标,要求坐标的数据类型可以是整数.小数和字符串,例如: x = 1 ...

  7. JSP内置对象阶段案例

    1.login2: <%@ page language="java" import="java.util.*" pageEncoding="UT ...

  8. 玩转shell之符号篇

    转:http://hi.baidu.com/hellosimple/item/21b31dfefd23e811e2e3bd47 在shell中常用的特殊符号罗列如下: # ; ;; . , / \\ ...

  9. quartz Cron-Expression的表达式

    关于quartz Cron-Expression的表达式,这个博客写的很好 ttp://www.cnblogs.com/yaowen/p/3779284.html CronTrigger配置完整格式为 ...

  10. php安装扩展步骤(redis)

    星哥让装一个扩展,解决PDF抓PNG的问题,功能没有实现,有点小悲伤,但是还是学到点东西的. php安装扩展步骤(以redis为例) 前提注意:在自己的LINUX本机上一定要安装有redis软件,我之 ...