1.说明
请参见第一章节
2.桥接模式说明
桥接模式:将抽象部分与它的实现部分分离,使他们都可以独立的变化
使用范围:在多个系类族中,每个族都在互相变化,一个族的变化,会影响到其它族的变化。那么这时候可以使用桥接模式,来实现
抽象与实现的分离:并不是说抽象类与其派生类分离,实现指的是抽象类和它的派生类用来实现自己的对象
关于对象继承:继承在编译阶段就定义好了,所以无法在运行时改变从父类继承的实现。子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然导致子类的变化。当你需要复用子类时,如果继承下来的实现不能够解决新的问题,则父类必须重写,或被其它更适合的替换。这种复用限制了灵活性。
聚合:弱拥有的关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分
合成:强拥有,体现了严格的部分与整体,部分和整体的生命周期一样
3.UML
//该UML说明在多个手机厂商和软件之间关系,该进行如何组合
这种方式当增加手机品牌时改动较大
这种方式当在增加手机软件时改动较大
由于实现方式有多种,桥接模式的核心意图就是把这些实现独立出来,让他们各自变化,这就使得每种实现的改变不会影响其他实现,达到应对变化的目的
4.代码
//手机基类
#ifndef __PHONE_H
#define __PHONE_H
#include <iostream>
#include <string>
#include <list>
#include "Soft.h"
typedef std::list<CSoft*> SOFTLIST;
class CPhone
{
public:
CPhone(std::string name):m_name(name)
{
}
void add_soft(CSoft* phonesoft)
{
m_softlist.push_back(phonesoft);
}
void run_soft()
{
for (SOFTLIST::iterator it=m_softlist.begin(); it!=m_softlist.end(); it++)
{
(*it)->run();
}
}
protected:
std::string m_name;
SOFTLIST m_softlist;
};
#endif
//手机M实现
#ifndef __PHONEM_H
#define __PHONEM_H
#include <list>
#include "Phone.h"
#include "Soft.h"
class CPhoneM:public CPhone
{
public:
CPhoneM(std::string name):CPhone(name)
{
}
private:
};
#endif
//手机N的实现
#ifndef __PHONEN_H
#define __PHONEN_H
#include "Phone.h"
class CPhoneN:public CPhone
{
public:
CPhoneN(std::string name):CPhone(name)
{
}
};
#endif
//软件基类
#ifndef __SOFT_H
#define __SOFT_H
#include <iostream>
#include <string>
class CSoft
{
public:
CSoft(std::string name):m_name(name){}
~CSoft(){}
virtual void run() = 0;
protected:
std::string m_name;
};
#endif
//游戏类
#ifndef __GAME_H
#define __GAME_H
#include "Soft.h"
class CGame:public CSoft
{
public:
CGame(std::string name):CSoft(name)
{
}
virtual void run()
{
std::cout<<"game run:"<<m_name.c_str()<<std::endl;
}
};
#endif
//通讯录类
#ifndef __ADDRESS_H
#define __ADDRESS_H
#include "Soft.h"
class CAddRess:public CSoft
{
public:
CAddRess(std::string name):CSoft(name)
{
}
virtual void run()
{
std::cout<<"address run:"<<m_name.c_str()<<std::endl;
}
};
#endif
//客户端调用类
#include <iostream>
#include "Soft.h"
#include "Game.h"
#include "AddRess.h"
#include "Phone.h"
#include "PhoneM.h"
#include "PhoneN.h"
int main(void)
{
CSoft* game_n = new CGame("N game");
CSoft* address_n = new CAddRess("N address");
CSoft* game_m = new CGame("M game");
CSoft* address_m = new CAddRess("M address");
CPhone* phone_n = new CPhoneN("N phone");
CPhone* phone_m = new CPhoneM("M Phone");
phone_n->add_soft(game_n);
phone_n->add_soft(address_n);
phone_n->run_soft();
std::cout<<std::endl<<std::endl;
phone_m->add_soft(game_m);
phone_m->add_soft(address_m);
phone_m->run_soft();
delete game_n;
delete address_n;
delete game_m;
delete address_m;
delete phone_n;
delete phone_m;
return 0;
}