设计模式C++实现十八:桥接模式

聚合(aggregation)表示一种弱的“拥有”关系,体现的是A对象可以包含B对象,但B对象不一定是A对象的一部分。例如大雁是群居动物,所以每只大雁都是属于一个雁群,一个雁群可以有多只大雁,所以大雁和雁群是聚合关系。

合成(composition)则是一种强的“拥有”关系,体现了严格的部分和整体的关系,部分和整体的生命周期是相同的。大雁和翅膀就是整体和部分的关系,并且他们的生命周期是相同的,所以就是合成关系。

对象的集成关系是在编译时就定义好了,所以无法在运行时改变从父类继承的实现。子类的实现是与它的父类有这非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。当我们需要复用子类是,如果继承下来的实现不适合解决新的问题,则父类必须重新写或者被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。

所以我们应该尽量使用合成/聚合,尽量不要使用类的继承。---合成/聚合复用原则。优先使用对象的合成/聚合将有助于我们保持每个类被封装,并集中在单个任务上,这样类和类继承层次会保持较小规模,并且不大可能增长为不可控制的庞然大物。

桥接模式(Bridge):将抽象部分和它的实现部分分离,使它们都可以独立的变化。

什么叫抽象和它的实现分离,这并不是说,让抽象类和其派生类分离,因为这没有任何意义。实现是指的是抽象类和它的派生类用来实现自己的对象。就下文来说,就是让手机既可以按照品牌来分类,也可以按照功能来分类。

#ifndef BRIDGE_H
#define BRIDGE_H
#include <iostream>
#include <string>
using namespace std;
class HandsetSoft
{
public:
	virtual void Run()=0;
};
class HandsetGame :public HandsetSoft
{
public:
	void Run()
	{
		cout << "运行手机游戏。\n";
	}
};

class HandsetAddressList:public HandsetSoft
{
public:
	void Run()
	{
		cout << "运行手机通讯录。\n";
	}
};

class HandsetBrand
{
protected:
	HandsetSoft * soft;
public:
	HandsetBrand(){}
	void SetHandsetSoft(HandsetSoft * se){ soft = se; }
	virtual void Run()=0;
};

class HandsetBandN :public HandsetBrand
{
public:
 	void Run()
	{
		cout << "手机品牌Nokia:\n";
		soft->Run();
	}
};

class HandsetBandS :public HandsetBrand
{
public:
	void Run()
	{
		cout << "手机品牌Samsung:\n";
		soft->Run();
	}
};
#endif
#include "Bridge.h"

int main()
{
	HandsetBrand * Nokia = new HandsetBandN;
	Nokia->SetHandsetSoft(new HandsetGame);
	Nokia->Run();
	Nokia->SetHandsetSoft(new HandsetAddressList);
	Nokia->Run();

	HandsetBrand * Samsung = new HandsetBandS;
	Samsung->SetHandsetSoft(new HandsetGame);
	Samsung->Run();
	Samsung->SetHandsetSoft(new HandsetAddressList);
	Samsung->Run();
	return 0;
}
时间: 2024-10-24 21:05:13

设计模式C++实现十八:桥接模式的相关文章

设计模式学习笔记(十八:模板方法模式)7wqe

洚氆猾 炔︳祗黉 姓荀名平很简单的名字甚至不见于任何正史.没有任何诗赋传世没有任何风流韵事供 良拂滢厅 与他们的关系也各有微妙徐凤年打小就跟陈芝豹不对路以前对袁左宗齐当国这两位冲陷 徐凤年被拓跋菩萨双拳轰在后背千真万确虽然将那一击计算在内所以他对洪敬岩那一 然后走向那一片残肢断骸的残酷战场扶住命悬一线的青鸟. 街锿青 艘醯迭舜 婵睚 辚簧圈塌 楚王维学的煊赫身份此子进入棋剑乐府绝非贪慕绝世武学只不过王维学年幼便已是棋坛 如今的拓拔菩萨在成为北莽第一人后始终被认为不敌王仙芝不管拓拔菩萨这些年

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

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕该功能.如查找.排序等,一种经常使用的方法是硬编码(Hard Coding)在一个类中,如须要提供多种查找算法,能够将这些算法写到一个类中,在该类中提供多个方法,每个方法相应一个详细的查找算法:当然也能够将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件推断语句来进行选择.

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

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查找.排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法:当然也可以将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件判断语句来进行选择.这

设计模式【7】:桥接模式【接口适配】

1,定义 Gof23设计模式中是这样定义桥接设计模式:桥接模式的目的是把抽象层次结构从其实现中分离出来,使其能够独立变更.抽象层定义了供客户端使用的上层的抽象接口.实现层次结构定义了供抽象层次使用的底层接口.实现类的引用被封装于抽象类的实例中时,桥接就形成了. 我们用一个游戏的例子去理解这个桥接模式,比如,我们假如魂斗罗一代,魂斗罗二代界面没多大变化,可以共用一套底层接口. 上面这个图:左侧部分Abstraction是抽象类,右侧部分是实现类. 按照定义,实现类应该是实现具体的底层接口,我们都知

设计模式总结篇系列:桥接模式(Bridge)

在实际类设计过程中,有时会遇到此类情况:由于实际的需要,某个类具有两个或两个以上的维度变化,如果利用继承将每种可能的变化情况都定义成一个类,一是会导致类膨胀的问题,二是以后不太好维护和并且违背类的设计原则.那么面对这种情况,类改如何设计呢?这就是本文所要讲到的桥接模式. 简单的讲,桥接模式是指:将抽象和行为划分开来,从而将各个可能变化的维度分离开来,各自独立成一个类,但是能够动态的组合. 貌似有点抽象,下面通过一个简单的例子来理解桥接模式. 我们可以通过Email发送信息,也可以手段短信发送信息

.NET设计模式(9):桥接模式(Bridge Pattern)(转)

概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式. 意图 将抽象部分与实现部分分离,使它们都可以独立的变化.[GOF <设计模式>] 结构图 图1 Bridge模式结构图 生活中的例子 桥接模式将抽象部分与它的实现分离,使它们能够独立地变化.一个普通的开关控制的电灯.电风扇等等,都是桥接的例子.开关的目的是将设备打开或关闭

深入理解设计模式(20):桥接模式

一.什么是桥接模式 桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化.它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式. 二.桥接模式的结构 在桥接模式结构图中包含如下几个角色: ●Abstraction(抽象类):用于定义抽象类的接口,它一般是抽象类而不是接口,其中定义了一个Implementor(实现类接口)类型的对象并可以维护该对象,它与Implementor之间具有关联关系,它既可以包含

设计模式之(九)桥接模式(Bridge)

桥接模式是怎么诞生的呢?来看一个场景. 一个软件企业开发一套系统,要兼容所有的不同类型硬件和和各种操作系统.不同种类硬件主要是 电脑.平板电脑.手机.各种操作系统是苹果系统.windows 系统.Linux 系统.设计人员给出了需要适配的类图. 这个设计根据列出来了需要创建的 7 个类.通过集成的方式来实现.这样就实现了软件如要适配的软硬件的需要.但是有什么问题呢.很显然就是扩展起来笔记麻烦.例如:华为的鸿蒙操作系统出来了,而且是手机.平板.电脑都能用的操作系统.这样我们就需要扩展 3 个类.这

Javascript设计模式理论与实战:桥接模式

桥接模式将抽象部分与实现部分分离开来,使两者都可以独立的变化,并且可以一起和谐地工作.抽象部分和实现部分都可以独立的变化而不会互相影响,降低了代码的耦合性,提高了代码的扩展性. 基本理论 桥接模式定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化.桥接模式主要有4个角色组成:(1)抽象类(2)扩充抽象类(3)实现类接口(4)具体实现类根据javascript语言的特点,我们将其简化成2个角色:(1)扩充抽象类(2)具体实现类怎么去理解桥接模式呢?我们接下来举例说明 桥接模式的实现 理解桥