Bridge模式
模式 Bridge
2023-09-11 14:14:09 时间
Bridge模式
在面向对象的开发过程中,要做到2点:1、高内聚(cohesion)。2、松耦合(coupling)。可是在实际开发过程中难以把握,比如会遇到这种问题:
1)客户给了一个需求,之后我们用一个类A来实现。
2)客户的需求有了变化,要用到2个算法来实现。于是我们通过定义一个抽象基类A,在用两个详细类A1和A2实现这两个算法。
3)客户需求又有了变化,要求在2个操作系统上实现。我们再抽象一个层次,不同操作系统抽象为A0和A1,每一个操作系统上有2个算法,在实现为A00、A01和A10、A11,总共同拥有4个类。
4)客户需求假设再有变化,那么我们又要又一次设计。
Bridge模式正是解决问题的。
Bridge模式的核心在于将抽象部分和实现分离,它们两者能够独立的变化。
它的类结构图例如以下:
以下是实现的代码
//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.cpp
#include"Abstraction.h"
#include"AbstractionImp.h"
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();
};
class ConcreteAbstractionImpA :public AbstractionImp
{
public:
ConcreteAbstractionImpA();
~ConcreteAbstractionImpA();
virtual void Operation();
};
class ConcreteAbstractionImpB :public AbstractionImp
{
public:
ConcreteAbstractionImpB();
~ConcreteAbstractionImpB();
virtual void Operation();
};
#endif
//AbstractionImp.cpp
#include"AbstractionImp.h"
#include<iostream>
using namespace std;
AbstractionImp::AbstractionImp()
{
}
AbstractionImp::~AbstractionImp()
{
}
ConcreteAbstractionImpA::ConcreteAbstractionImpA()
{
}
ConcreteAbstractionImpA::~ConcreteAbstractionImpA()
{
}
void ConcreteAbstractionImpA::Operation()
{
cout << "ConcreteAbstractionImpA Operation" << endl;
}
ConcreteAbstractionImpB::ConcreteAbstractionImpB()
{
}
ConcreteAbstractionImpB::~ConcreteAbstractionImpB()
{
}
void ConcreteAbstractionImpB::Operation()
{
cout << "ConcreteAbstractionImpB Operation" << endl;
}
//main.cpp
#include"Abstraction.h"
#include"AbstractionImp.h"
int main()
{
AbstractionImp* impA = new ConcreteAbstractionImpA();
AbstractionImp* impB = new ConcreteAbstractionImpB();
Abstraction* absA = new RefinedAbstraction(impA);
Abstraction* absB = new RefinedAbstraction(impB);
absA->Operation();
absB->Operation();
return 0;
}
相关文章
- Servlet使用适配器模式进行增删改查案例(DeptDaoImpl.java)
- 阅读天龙八部的代码有感----两种逻辑处理模式的比较
- 炒冷饭系列:设计模式 建造者模式
- Flyweight 享元模式 [MD]
- 另类多线程生产者与消费者模式
- 31、activity 四种工作模式
- Atitit 微服务实践 艾提拉著 微服务主要解决几个问题负载均很 目录 1. 微服务的模式 http请求层 vs服务层1 1.1. Http vs 服务层优缺点1 2. 实现技术2
- Atitit gui的实现模式文本 dom ast 像素绘图api native 目录 1. Pl ast xml domAst1 1.1. 简介1 1.1.1. 【具体语法树】2 2.
- C++ 单例模式
- python 设计模式之解释器(Interpreter)模式
- 基于电商模式的性能测试(1) —— 基础知识铺垫
- 享元模式
- ROLAP 和 Direct Query(DQ)模式的区别
- 【设计模式】深入浅出--外观模式