结构型模式一之Bridge

来源:互联网 发布:java 处理换行符 编辑:程序博客网 时间:2024/06/05 21:03

1. UML


2. 意图:将抽星部分与它的实现部分分离,使得它们可以独立的变化;使用组合(委托)的方式将抽象和实现彻底地解耦,这样的好处是抽象和实现可以分别独立地变化,系统的耦合性也得到了很好的降低。

3. code

Abstraction.h

//Abstraction.h#ifndef _ABSTRACTION_H_#define _ABSTRACTION_H_class AbstractionImp;class Abstraction{public:virtual ~Abstraction();virtual void Operation() = 0;protected:Abstraction();};class RefinedAbstraction:public Abstraction{public:RefinedAbstraction(AbstractionImp* imp);~RefinedAbstraction();void Operation();private:AbstractionImp* _imp;};#endif //~_ABSTRACTION_H_

Abstraction.cpp

//Abstraction.cpp#include "Abstraction.h"#include "AbstractionImp.h"#include <iostream>using namespace std;Abstraction::Abstraction(){}Abstraction::~Abstraction(){}RefinedAbstraction::RefinedAbstraction(AbstractionImp* imp){_imp = imp;}RefinedAbstraction::~RefinedAbstraction(){}void RefinedAbstraction::Operation(){_imp->Operation();}

AbstractionImp.h

//AbstractionImp.h#ifndef _ABSTRACTIONIMP_H_#define _ABSTRACTIONIMP_H_class AbstractionImp{public:virtual ~AbstractionImp();virtual void Operation() = 0;protected:AbstractionImp();private:};class ConcreteAbstractionImpA:public AbstractionImp{public:ConcreteAbstractionImpA();~ConcreteAbstractionImpA();virtual void Operation();protected:private:};class ConcreteAbstractionImpB:public AbstractionImp{public:ConcreteAbstractionImpB();~ConcreteAbstractionImpB();virtual void Operation();protected:private:};#endif //~_ABSTRACTIONIMP_H_

AbstractionImp.cpp
//AbstractionImp.cpp#include "AbstractionImp.h"#include <iostream>using namespace std;AbstractionImp::AbstractionImp(){}AbstractionImp::~AbstractionImp(){}void AbstractionImp::Operation(){cout<<"AbstractionImp....imp..."<<endl;}ConcreteAbstractionImpA::ConcreteAbstractionImpA(){}ConcreteAbstractionImpA::~ConcreteAbstractionImpA(){}void ConcreteAbstractionImpA::Operation(){cout<<"ConcreteAbstractionImpA...."<<endl;}ConcreteAbstractionImpB::ConcreteAbstractionImpB(){}ConcreteAbstractionImpB::~ConcreteAbstractionImpB(){}void ConcreteAbstractionImpB::Operation(){cout<<"ConcreteAbstractionImpB...."<<endl;}

main.cpp

//main.cpp#include "Abstraction.h"#include "AbstractionImp.h"#include <iostream>using namespace std;int main(int argc,char* argv[]){AbstractionImp* imp = new ConcreteAbstractionImpA();Abstraction* abs = new RefinedAbstraction(imp);abs->Operation();delete imp;delete abs;return 0;}

4. output