设计模式学习--桥接模式
来源:互联网 发布:echo linux 写入文件 编辑:程序博客网 时间:2024/04/30 10:15
首先,桥接模式是对象结构型模式的一种。桥接模式的定义:
将抽象与实现部分分离,使它们可以独立的发生变化。要说明的一点是,让抽象与实现分离,并不是说让抽象类与其派生类分离,因为这没有任何的意义。实现指的是抽象类和他的派生类用来实现自己的对象。更简单的理解就是实现系统可能有多种分类,每一种分类都有可能发生变化,那么就把这种多角度分离出来让他们独立的发生变化,减少他们之间的耦合。
桥接模式的结构图如下
适用性
1 你不希望在抽象和它的实现部分之间有一个固定的绑定关系
2 类的抽象以及他的实现部分应该可以通过生成子类的方法加以扩充。
3 将一个抽象的实现部分的修改应对一个客户不造成影响,即客户的代码不需重新编译
4 你想对客户完全隐藏抽象的实现部分
5 有许多类要生成,这样一种类层次结构说明你必须将一个对象分解成两个部分
6 你想在多个对象之间共享实现(可能使用引用计数),但同时要求客户并不知道这一点
协作
Abstraction将client的请求转发给他的Impletement对象
优点
1 分离接口与具体的实现部分,有助于分层,从而产生更好的结构层次,系统的高层部分仅需知道Abstraction和Impletementor
2 提高可扩充性
3 实现细节对客户透明
注意的问题
1 但只有一个Impletementor的时候,没必要有一个抽象类。但如果你想改变一个类的实现不会影响现有的客户程序时,模式的分离机制还是非常有用的。客户只需重新连接而不需要重新编译。
2 创建正确的Implementor类
3 共享Impletementor对象
4 不能采用多重继承实现真正的桥接模式。例如,一个类可以用Public方式继承Abstraction而已private方式继承ConcreteImpeltementor,但由于这种方法依赖于静态继承,它将实现部分与接口固定不变的绑定在一起。
// BridgeModel.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "Brand.h"#include "HandSetGame.h"#include "HandsetAddressList.h"#include "BrandM.h"#include "BrandN.h"int _tmain(int argc, _TCHAR* argv[]){ Brand* br = new BrandN(); br->setSoft(new HandsetGame); br->run(); br->setSoft(new HandsetAddressList); br->run(); delete br; br = nullptr; Brand* brM = new BradM(); brM->setSoft(new HandsetGame); brM->run(); brM->setSoft(new HandsetAddressList); brM->run(); delete brM; brM = nullptr; return 0;}/************************************************************************ @fileName:Brand.h @function: 桥接模式的抽象类 @author: jaime @ver: 1.0.0************************************************************************/#pragma once#include "HandsetSoft.h"class Brand{public: Brand(); ~Brand(); void setSoft(HandsetSoft* soft); virtual void run() = 0;private:protected: HandsetSoft* m_soft;};#include "Brand.h"Brand::Brand(){}Brand::~Brand(){}void Brand::setSoft(HandsetSoft* soft){ m_soft = soft;}/************************************************************************ @fileName:BrandN.h @function: 桥接模式的实现类 @author: jaime @ver: 1.0.0************************************************************************/#pragma once#include "Brand.h"class BrandN : public Brand{public: BrandN(); ~BrandN(); virtual void run();private:};#include "BrandN.h"BrandN::BrandN(){}BrandN::~BrandN(){}void BrandN::run(){ m_soft->run();}/************************************************************************ @fileName:BrandM.h @function: 桥接模式的实现类 @author: jaime @ver: 1.0.0************************************************************************/#pragma once#include "Brand.h"class BradM : public Brand{public: BradM(); ~BradM(); virtual void run();private:};#include "BrandM.h"BradM::BradM(){}BradM::~BradM(){}void BradM::run(){ m_soft->run();}/************************************************************************ @fileName:HandsetSoft.h @function: 桥接模式的抽象类 @author: jaime @ver: 1.0.0************************************************************************/#pragma onceclass HandsetSoft{public: HandsetSoft(); ~HandsetSoft(); virtual void run() = 0;private:};/************************************************************************ @fileName:HandSetGame.h @function: 桥接模式的具体实现类 @author: jaime @ver: 1.0.0************************************************************************/#pragma once#include "HandsetSoft.h"class HandsetGame : public HandsetSoft{public: HandsetGame(); ~HandsetGame(); virtual void run();private:};#include "HandSetGame.h"#include <iostream>using namespace std;HandsetGame::HandsetGame(){}HandsetGame::~HandsetGame(){}void HandsetGame::run(){ cout << "运行手机游戏" << endl;}/************************************************************************ @fileName:HandsetAddressList.h @function: 桥接模式的具体实现类 @author: jaime @ver: 1.0.0************************************************************************/#pragma once#include "HandsetSoft.h"class HandsetAddressList : public HandsetSoft{public: HandsetAddressList(); ~HandsetAddressList(); virtual void run();private:};#include "HandsetAddressList.h"#include <iostream>using namespace std;HandsetAddressList::HandsetAddressList(){}HandsetAddressList::~HandsetAddressList(){}void HandsetAddressList::run(){ cout << "运行手机通讯录" << endl;}
如果要加上一个其他的功能类,如Mp3,只需继承Soft就可以实现了,加品牌的话就继承Brand实现就可以了。两边可以独立的发生变化。
- 设计模式学习----Bridge桥接模式
- 设计模式学习笔记-桥接模式
- 设计模式学习-----桥接模式
- 设计模式学习之桥接模式
- 设计模式学习(十二):桥接模式
- 设计模式学习--桥接模式
- 设计模式学习笔记-桥接模式
- 设计模式实例学习-桥接模式
- 设计模式学习--桥接模式
- 设计模式学习笔记--桥接模式
- 设计模式学习笔记--桥接模式
- 设计模式学习--桥接模式
- 学习设计模式-桥接模式
- 设计模式学习-桥接模式
- 设计模式学习-工厂模式/桥接模式
- 设计模式学习笔记十四:适配器模式、桥接模式与外观模式
- 设计模式学习笔记十四:适配器模式、桥接模式与外观模式
- 设计模式----桥接模式
- 7-9工作日志
- KMP与扩展KMP
- 一致性hash算法-php-redis版本
- 集合(3) Map集合,工具类
- C++这个名字
- 设计模式学习--桥接模式
- 2015070904 - 阅读后的书籍有着落了
- leetCode 40.Combination Sum II(组合总和II) 解题思路和方法
- 1985年公布的C++语言1.0版的内容中又添加了一些重要特征
- API其他函数 ,system date,..
- 弱引用NSTimer对象
- Java.Lang.NoSuchMethod 错误
- C#基础学习需要注意的几个知识点
- jsp(六) setProperty getProperty