设计模式(六)bridge

来源:互联网 发布:淘宝980ti能买吗 编辑:程序博客网 时间:2024/06/05 17:11

1.使用场景:某些类具有两个或多个变化的维度(平台),且不同维度中有大量重复的静态特质代码

2.理论依据:多态、虚函数

3.定义:将抽象部分(业务功能)与实现部分(平台实现)分离,使得他们都可以独立地变化

4.步骤:将原基类,拆分为两个或多个不同的基类,新的基类通过组合实现它们之间的关系,通过对新基类,进行类似decorator设计模式的操作,完成对不同维度责任的划分

5.技法:继承->组合
编译时装配->运行时装配(多态)

6.变化:原基类根据不同维度(平台)拆分,通过多态实现运行时调用的功能
不变:不能再改变的基类


对比decorator:

相同点:对于A类要调用B类的功能,并且A类的成员函数的实现,都是直接或间接通过调用B类的成员函数,此时

使用组合的设计方式

不同点:bridge还需根据不同的平台对基类进行拆分,组合使用是在拆分的基类中完成的
而decorator并不需要拆分


原代码:


class Messager{public:    virtual void Login(string username, string password)=0;    virtual void SendMessage(string message)=0;    virtual void SendPicture(Image image)=0;    virtual void PlaySound()=0;    virtual void DrawShape()=0;    virtual void WriteText()=0;    virtual void Connect()=0;        virtual ~Messager(){}};//平台实现class PCMessagerBase : public Messager{public:        virtual void PlaySound(){        //**********    }    virtual void DrawShape(){        //**********    }    virtual void WriteText(){        //**********    }    virtual void Connect(){        //**********    }};class MobileMessagerBase : public Messager{public:        virtual void PlaySound(){        //==========    }    virtual void DrawShape(){        //==========    }    virtual void WriteText(){        //==========    }    virtual void Connect(){        //==========    }};//业务抽象class PCMessagerLite : public PCMessagerBase {public:        virtual void Login(string username, string password){                PCMessagerBase::Connect();        //........    }    virtual void SendMessage(string message){                PCMessagerBase::WriteText();        //........    }    virtual void SendPicture(Image image){                PCMessagerBase::DrawShape();        //........    }};class PCMessagerPerfect : public PCMessagerBase {public:        virtual void Login(string username, string password){                PCMessagerBase::PlaySound();        //********        PCMessagerBase::Connect();        //........    }    virtual void SendMessage(string message){                PCMessagerBase::PlaySound();        //********        PCMessagerBase::WriteText();        //........    }    virtual void SendPicture(Image image){                PCMessagerBase::PlaySound();        //********        PCMessagerBase::DrawShape();        //........    }};class MobileMessagerLite : public MobileMessagerBase {public:        virtual void Login(string username, string password){                MobileMessagerBase::Connect();        //........    }    virtual void SendMessage(string message){                MobileMessagerBase::WriteText();        //........    }    virtual void SendPicture(Image image){                MobileMessagerBase::DrawShape();        //........    }};class MobileMessagerPerfect : public MobileMessagerBase {public:        virtual void Login(string username, string password){                MobileMessagerBase::PlaySound();        //********        MobileMessagerBase::Connect();        //........    }    virtual void SendMessage(string message){                MobileMessagerBase::PlaySound();        //********        MobileMessagerBase::WriteText();        //........    }    virtual void SendPicture(Image image){                MobileMessagerBase::PlaySound();        //********        MobileMessagerBase::DrawShape();        //........    }};void Process(){        //编译时装配        Messager *m =            new MobileMessagerPerfect();}

使用bridge设计模式:

class Messager{protected:     MessagerImp* messagerImp;//...public:    virtual void Login(string username, string password)=0;    virtual void SendMessage(string message)=0;    virtual void SendPicture(Image image)=0;        virtual ~Messager(){}};class MessagerImp{public:    virtual void PlaySound()=0;    virtual void DrawShape()=0;    virtual void WriteText()=0;    virtual void Connect()=0;        virtual MessagerImp(){}};//平台实现 nclass PCMessagerImp : public MessagerImp{public:        virtual void PlaySound(){        //**********    }    virtual void DrawShape(){        //**********    }    virtual void WriteText(){        //**********    }    virtual void Connect(){        //**********    }};class MobileMessagerImp : public MessagerImp{public:        virtual void PlaySound(){        //==========    }    virtual void DrawShape(){        //==========    }    virtual void WriteText(){        //==========    }    virtual void Connect(){        //==========    }};//业务抽象 m//类的数目:1+n+mclass MessagerLite :public Messager {    public:        virtual void Login(string username, string password){                messagerImp->Connect();        //........    }    virtual void SendMessage(string message){                messagerImp->WriteText();        //........    }    virtual void SendPicture(Image image){                messagerImp->DrawShape();        //........    }};class MessagerPerfect  :public Messager {       public:        virtual void Login(string username, string password){                messagerImp->PlaySound();        //********        messagerImp->Connect();        //........    }    virtual void SendMessage(string message){                messagerImp->PlaySound();        //********        messagerImp->WriteText();        //........    }    virtual void SendPicture(Image image){                messagerImp->PlaySound();        //********        messagerImp->DrawShape();        //........    }};void Process(){    //运行时装配    MessagerImp* mImp=new PCMessagerImp();    Messager *m =new Messager(mImp);}


原创粉丝点击