文章目录
- 一、桥接模式基础知识
- 二、桥接模式实战应用
一、桥接模式基础知识
桥接模式定义:将抽象部分与它的实现部分分离,使它们都可以
独立地变化。桥接模式的结构图如下:
Abstraction:抽象部分的接口。
RefinedAbstraction:扩展抽象部分的接口。
Implementor:定义实现部分的接口。
ConcreteImplementor:真正实现 Implementor 接口的对象(具体实现类)。
桥接模式应用场景:
当一个类内部具备两种或多种变化维度时,使用桥接模式解耦这些变化的维度,使高层代码架构稳定
。
当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时
。
当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。
当一个系统不希望使用继承或因为多层次继承
导致系统类的个数急剧增加时。
二、桥接模式实战应用
手机支付方式:支付宝 APP、微信、HuaweiPay 等多种,
APP支持三种付款验证:密码、指纹、人脸。
桥接模式实现方式:IPayMode类是实现类,定义基本操作 security(),用于设置验证方式,其子类
提供实现,它位于桥接模式的抽象层。
#include <iostream>
using namespace std;// 支付模式--实现化角色(实现类接口,Implementation(实现类接口))
class IPayMode {
public:virtual bool security(string Uid) = 0;
};// 具体实现化角色:密码支付(具体实现类)
class PayCypher :public IPayMode {
public:bool security(string uId) override {cout << "密码支付,风控校验环境安全." << endl;return true;}
};// 人脸支付
class PayFaceMode :public IPayMode {
public:bool security(string uId) override {cout << "人脸支付,风控校验脸部识别." << endl;return true;}
};// 指纹支付
class PayFingerPrintMode :public IPayMode {
public:bool security(string uId) override {cout << "指纹支付,风控校验指令信息安全." << endl;return true;}
};// 抽象化类:支付(抽象化角色)
class Pay {
public:IPayMode *payMode;Pay(IPayMode* payMode){this->payMode = payMode; // 抽象类定义一个IPayMode,跟IPayMode存在关联关系}virtual ~Pay() {delete payMode;}virtual string transfer(string uId, string tradeId, long long amount) = 0;};// 扩展抽象化角色:微信支付
class WxPay :public Pay {
public:WxPay(IPayMode* payMode) :Pay(payMode) {}// 扩展抽象类(实现抽象类中定义的成员函数)string transfer(string uId, string tradeId, long long amount) {cout << "微信支付开始,用户ID:" << uId << "交易ID:" << tradeId << "交易金额:" << amount << endl;bool security = payMode->security(uId);if (!security){cout << "微信支付失败,用户ID:" << uId << "交易ID:" << tradeId << "交易金额:" << amount << endl;return "Fail000";}else{cout << "微信支付成功,用户ID:" << uId << "交易ID:" << tradeId << "交易金额:" << amount << endl;return "Success001";}}
};// 扩展抽象化角色:支付宝支付
class AliPay :public Pay {
public:AliPay(IPayMode* payMode) :Pay(payMode) {}// 扩展抽象类(实现抽象类中定义的成员函数)string transfer(string uId, string tradeId, long long amount) {cout << "支付宝支付开始,用户ID:" << uId << "交易ID:" << tradeId << "交易金额:" << amount << endl;bool security = payMode->security(uId);if (!security){cout << "支付宝支付失败,用户ID:" << uId << "交易ID:" << tradeId << "交易金额:" << amount << endl;return "Fail000";}else{cout << "支付宝支付成功,用户ID:" << uId << "交易ID:" << tradeId << "交易金额:" << amount << endl;return "Success001";}}
};// 扩展抽象化角色:华为支付
class HuaweiPay :public Pay {
public:HuaweiPay(IPayMode* payMode) :Pay(payMode) {}// 扩展抽象类(实现抽象类中定义的成员函数)string transfer(string uId, string tradeId, long long amount) {cout << "华为支付开始,用户ID:" << uId << "交易ID:" << tradeId << "交易金额:" << amount << endl;bool security = payMode->security(uId);if (!security){cout << "华为支付失败,用户ID:" << uId << "交易ID:" << tradeId << "交易金额:" << amount << endl;return "Fail000";}else{cout << "华为支付成功,用户ID:" << uId << "交易ID:" << tradeId << "交易金额:" << amount << endl;return "Success001";}}
};int main()
{cout << "--------------------请选择付款方式--------------------" << endl;Pay* wxpay = new WxPay(new PayFaceMode());wxpay->transfer("weixin_666", "20221201", 290000);cout << endl << endl;cout << "--------------------请选择付款方式--------------------" << endl;Pay* huawei = new HuaweiPay(new PayCypher());huawei->transfer("Huawei_888", "20221208", 1000000);cout << endl << endl;cout << "--------------------请选择付款方式--------------------" << endl;Pay* alipay = new AliPay(new PayFingerPrintMode());alipay->transfer("Alipay_999", "20221209", 9000000);cout << endl << endl;return 0;
}