C++设计模式——桥接模式(bridge pattern)
一、原理讲解
1.1意图
将抽象部分和实现部分分离,使它们可以独立的变化。(别名:handle/body)
1.2应用场景
- 当你不希望抽象和它的实现部分有一种紧密耦合关系,希望在运行时可以切换不同的实现;
- 类的抽象和实现都可以通过继承子类的方法进行扩充,这时可以选着桥接模式,运用组合方式分别对抽象和实现进行扩充;
- 当你像完全对客户隐藏抽象时,可以使用桥接模式;(继承时,抽象是可见的)
- 当你像抽象有多个扩展,实现也有多个方向扩展时使用。’
1.3结构图(UML图)
1.4代码实现步骤
a1 定义一个抽象接口类Abstraction,抽象接口函数operation();(抽象部分定义接口,实现在具体类中)
a2 定义一个实现接口类Implement,抽象接口函数operation();(抽象部分定义接口,实现在具体类中)
a3 定义一个扩展抽象类RefinedAbstraction : public Abstraction。在类RedefinedAbstraction实现接口函数operation(),组合实现抽象Implement,在operation函数内实现具体操作;(最重要的组合抽象实现类)
a4 定义两个具体实现类ConcreteImplementA和ConcreteImplementB,具体的实现细节放在接口函数operation()里面。(具体实现类细节)
二、实现代码
BridgeParttern.cpp
#include <iostream>
using namespace std;
#define DELETE(pointer) delete pointer; pointer=nullptr
class Abstraction // 抽象接口
{
public:
virtual ~Abstraction(){}
virtual void operation() = 0;
protected:
Abstraction() {}
};
class Implement // 实现抽象接口
{
public:
virtual ~Implement() {}
virtual void operation() = 0;
protected:
Implement() {}
};
class ConcreteImplementA : public Implement // 具体实现细节类A
{
public:
virtual void operation() override
{
cout << "run function ConcreteImplementA::operation()!" << endl;
}
};
class ConcreteImplementB : public Implement // 具体实现细节类B
{
public:
virtual void operation() override
{
cout << "run function ConcreteImplementB::operation()!" << endl;
}
};
class RefinedAbstraction : public Abstraction // 具体抽象细节类
{
public:
RefinedAbstraction(Implement* implement)
{
this->implement = implement;
}
virtual void operation() override
{
cout << "enter function RefinedAbstraction::operation()!" << endl;
implement->operation();
}
private:
Implement* implement;
};
void doBridgeParttern()
{
//抽象实例调用实现A
Implement *implement = new ConcreteImplementA();
Abstraction *abstraction = new RefinedAbstraction(implement);
abstraction->operation();
DELETE(implement);
DELETE(abstraction);
//抽象实例调用实现B
implement = new ConcreteImplementB();
abstraction = new RefinedAbstraction(implement);
abstraction->operation();
DELETE(implement);
DELETE(abstraction);
}
main.cpp
#include <iostream>
extern void doBridgeParttern();
int main()
{
doBridgeParttern();
system("pause");
return 1;
}
参考内容:
https://www.cnblogs.com/070412-zwc/p/6891271.html(参考:代码实现)
https://www.bilibili.com/video/av22292899?from=search&seid=8813426322713310552(参考:哔哩哔哩C++设计模式!!!)
Erich Gamma,Richard Helm.《设计模式 可复用面向对象软件的基础》[M].机械工业出版社,2019:115-123
原文地址:https://blog.csdn.net/naibozhuan3744/article/details/106877284