桥接模式-抽象与实现的分离

    说到桥接模式,其最基本的目的就是要达到抽象部分与实现部分的相分离,使他们每一部分都能够独立的变化。然而,这句话还是不好理解的。套用大话设计模式的一句话,所谓的实现和抽象相分离,就是实现一个系统,有可能有多个角度对系统进行分类,而这其中的每一个角度都有可能发生变化,而桥接模式把这多个角度抽离出来实现,以便其独立的变化。就像手机一样,可以用牌子给他归类,也可以按不同的软件,如MP3给他归类,就像下面的例子代码,若要添加一个品牌,所需要做的就是从牌子的基类派生一个具体的子类来实现,若要添加一个软件的话,从软件基类派生一个子类来实现便可以了,而不会影响其他的类。手机软件和手机牌子是一个聚合关系。(实际上下面的游戏类也可以独立出一个类层次来)。

// tEST.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> using namespace std; //手机类的品牌的抽象接口,手机从品牌角度的一个分类 class CBrand { public: CBrand(){}; virtual ~CBrand(){}; virtual void Display() = 0; }; //M品牌手机的实现 class CMotoBrand:public CBrand { public: CMotoBrand(){}; virtual ~CMotoBrand(){}; virtual void Display(); }; void CMotoBrand::Display() { cout<<"Welcome to Moto"<<endl; } //N品牌的手机的实现 class CNokiaBrand:public CBrand { public: CNokiaBrand(){}; virtual ~CNokiaBrand(){}; virtual void Display(); }; void CNokiaBrand::Display() { cout<<"Welcome to Nokia"<<endl; } //手机的另一个角度的实现,手机软件的抽象类 class CSoftWare { public: CSoftWare(CBrand* cb):m_brand(cb){}; CSoftWare(){}; virtual ~CSoftWare(){}; virtual void Display() = 0; protected: CBrand* m_brand; }; //手机软件中的MP3功能的实现 class CMp3:public CSoftWare { public: CMp3(CBrand* cb):CSoftWare(cb){}; CMp3(){}; virtual ~CMp3(){}; virtual void Display(); }; void CMp3::Display() { m_brand->Display(); cout<<"Play MP3"<<endl; } //手机软件中的游戏功能的实现 class CGame:public CSoftWare { public: CGame(CBrand* cb):CSoftWare(cb){}; CGame(){}; virtual ~CGame(){}; virtual void Display(); }; void CGame::Display() { m_brand->Display(); cout<<"Play Game"<<endl; } int main() { //带MP3功能的M品牌手机 CBrand* brand = new CMotoBrand; CSoftWare* soft = new CMp3(brand); soft->Display(); delete brand; delete soft; //带游戏功能的N品牌手机 brand = new CNokiaBrand; soft = new CGame(brand); soft->Display(); delete brand; delete soft; int a = 0; cin>>a; return 0; }

你可能感兴趣的:(桥接模式-抽象与实现的分离)