设计模式---结构类型---桥接

来源:互联网 发布:放烟花网络意思 编辑:程序博客网 时间:2024/05/12 10:13

1、意图

将抽象部分与它的实现部分分离,使它们都可以独立地变化。

2、适用性

1)你不希望在抽象和他的实现部分之间有一个固定的绑定关系。例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。

2)类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。

3)对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。

4)你想对客户完全隐藏抽象的实现部分。在C++中,类的表示在类接口中是可见的。

5)你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。

3、C++实例

// ootest.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#define  NULL 0// 实现基类class Implementor{public:virtual void Operation() = 0;virtual ~Implementor(){}protected:Implementor(){}};class ConcreteImplementorA:public Implementor{public:ConcreteImplementorA(){ }~ConcreteImplementorA(){ }void Operation(){std::cout<<"ConcreteImplementorA:Operation"<<std::endl;}};class ConcreteImplementorB:public Implementor{public:ConcreteImplementorB(){ }~ConcreteImplementorB(){ }void Operation(){std::cout<<"ConcreteImplementorB:Operation"<<std::endl;}};// 抽象基类class Abstraction{public:virtual void Operation() = 0;virtual ~Abstraction(){}protected:Abstraction(){}};class RefinedAbstractionA:public Abstraction{public:RefinedAbstractionA( Implementor *imp ){this->_imp = imp;}virtual void Operation(){std::cout<<"RefinedAbstractionA::Operation"<<std::endl;this->_imp->Operation();}virtual ~RefinedAbstractionA(){delete this->_imp;this->_imp = NULL;}private:Implementor *_imp;};class RefinedAbstractionB:public Abstraction{public:RefinedAbstractionB( Implementor *imp ){this->_imp = imp;}virtual void Operation(){std::cout<<"RefinedAbstractionB::Operation"<<std::endl;this->_imp->Operation();}virtual ~RefinedAbstractionB(){delete this->_imp;this->_imp = NULL;}private:Implementor *_imp;};int _tmain(int argc, _TCHAR* argv[]){/* 将抽象部分与它的实现部分分离,使得它们可以独立地变化    1、抽象Abstraction与实现Implementor分离;    2、抽象部分Abstraction可以变化,如new RefinedAbstractionA(imp)、new RefinedAbstractionB(imp2);    3、实现部分AbstractionImplement也可以变化,如new ConcreteImplementorA()、new ConcreteImplementorB();    */ConcreteImplementorA *imp1 = new ConcreteImplementorA();                     // 实现部分Abstraction *abs1 = new RefinedAbstractionA( imp1 );                         // 抽象部分abs1->Operation();std::cout<<"ConcreteImplementorA -- RefinedAbstractionA "<< std::endl;std::cout<<std::endl;ConcreteImplementorA *imp2 = new ConcreteImplementorA();Abstraction *abs2 = new RefinedAbstractionB( imp2 );abs2->Operation();std::cout<<"ConcreteImplementorA -- RefinedAbstractionB "<< std::endl;std::cout<<std::endl;ConcreteImplementorB *imp3 = new ConcreteImplementorB();Abstraction *abs3 = new RefinedAbstractionA( imp3 );abs3->Operation();std::cout<<"ConcreteImplementorB -- RefinedAbstractionA "<< std::endl;std::cout<<std::endl;ConcreteImplementorB *imp4 = new ConcreteImplementorB();Abstraction *abs4 = new RefinedAbstractionB( imp4 );abs4->Operation();std::cout<<"ConcreteImplementorB -- RefinedAbstractionB "<< std::endl;std::cout<<std::endl;return 0;}


0 0
原创粉丝点击