C++ Bridge 设计模式
Bridge模式是应用最广泛也是我个人比较喜欢的一个C++设计模式之一。
Bridge模式意图:降低抽象和实现之间的耦合。
面向对象系统设计和分析中最重要的一点就是:高内聚,低耦合。Bridge模式使得抽象和实现能够相对独立。
Bridge模式结构图:
Bridge模式的关键在于Abstraction的派生类中维护了一个纸箱Implementor类的指针。
让Implentor的派生类来去实现。从而实现了抽象和实现的相对独立。
参考代码:
- #pragma once
- //Abstraction.h
- class Abstraction
- {
- public:
- Abstraction(void){};
- virtual ~Abstraction(void){};
- virtual void Operation() = 0;
- };
- #pragma once
- //Implementor.h
- class Implementor
- {
- public:
- Implementor(void){};
- virtual ~Implementor(void){};
- virtual void OperationImp() = 0;
- };
- #pragma once
- //ConcreteImplementorA.h
- #include "implementor.h"
- class ConcreteImplementorA :
- public Implementor
- {
- public:
- ConcreteImplementorA(void);
- ~ConcreteImplementorA(void);
- void OperationImp();
- };
- #pragma once
- //ConcreteImplementorB.h
- #include "implementor.h"
- class ConcreteImplementorB :
- public Implementor
- {
- public:
- ConcreteImplementorB(void);
- ~ConcreteImplementorB(void);
- void OperationImp();
- };
- #pragma once
- //RefinedAbstraction.h
- #include "abstraction.h"
- #include "Implementor.h"
- class Implementor;
- class RefinedAbstraction :
- public Abstraction
- {
- public:
- RefinedAbstraction(void);
- RefinedAbstraction(Implementor *imp);
- ~RefinedAbstraction(void);
- void Operation();
- private:
- Implementor *m_imp;
- };
- #include <iostream>
- #include "ConcreteImplementorA.h"
- using namespace std;
- //ConcreteImplementonA.cpp
- ConcreteImplementorA::ConcreteImplementorA(void)
- {
- }
- ConcreteImplementorA::~ConcreteImplementorA(void)
- {
- }
- void ConcreteImplementorA::OperationImp()
- {
- cout << "Hi, I am in ConcreteImplementorA" << endl;
- }
- #include <iostream>
- #include "ConcreteImplementorB.h"
- using namespace std;
- //ConcreteImplementorB.cpp
- ConcreteImplementorB::ConcreteImplementorB(void)
- {
- }
- ConcreteImplementorB::~ConcreteImplementorB(void)
- {
- }
- void ConcreteImplementorB::OperationImp()
- {
- cout << "Hi, I am in ConcreteImplementorB" << endl;
- }
- #include <iostream>
- #include "RefinedAbstraction.h"
- using namespace std;
- //RefinedAbstraction.cpp
- RefinedAbstraction::RefinedAbstraction(void)
- {
- m_imp = NULL;
- }
- RefinedAbstraction::~RefinedAbstraction(void)
- {
- }
- RefinedAbstraction::RefinedAbstraction(Implementor *imp)
- {
- m_imp = imp;
- }
- void RefinedAbstraction::Operation()
- {
- m_imp->OperationImp();
- }
- #include "Abstraction.h"
- #include "ConcreteImplementorA.h"
- #include "ConcreteImplementorB.h"
- #include "RefinedAbstraction.h"
- //main.cpp
- int main()
- {
- ConcreteImplementorA *pImpA = new ConcreteImplementorA;
- ConcreteImplementorB *pImpB = new ConcreteImplementorB;
- Abstraction *objA = new RefinedAbstraction(pImpA);
- Abstraction *objB = new RefinedAbstraction(pImpB);
- objA->Operation();
- objB->Operation();
- }
我个人 非常欣赏也非常推崇Bridge模式。