桥接模式
桥接模式适用于处于两个维度或者多维度需求的情况,比如画图的时候,存在形状和颜色;吃饭的时候,存在小吃、甜品、主食、菜肴等等。
而这个模式放在生活中就是分类讨论的一种罢了,比如你和朋友去吃一顿饭,点菜的时候如果全是固定的主食+菜肴,这对于聚会就很麻烦,因此常常用来解决的方法有两种:
- 都可以单点的模式,在点菜的时候就会自然的点几个热菜、主食点什么、喝的要不要
- 固定几人桌。但是具体什么菜、主食等等也是分开讨论的。
这种事物的处理方式在软件开放过程中就称为桥接模式。
官方点的解释就是:【GOF95】桥梁模式的用意是"将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化"。这句话有三个关键词,也就是抽象化、实现化和脱耦。
抽象化:将各个维度进行抽象化,简单来说就是同个维度使用接口进行统一抽象化,开放过程就是继承派生的接口处理,而在聚会就是“主食”、“佳肴”,两个维度实现抽象接口。
实现化:就是将两个维度的具体实现以子类的方式进行实现拓展
脱耦:此处的脱耦简单来说就是将继承改为聚合关系,将强关联变为若关联。

Abstraction 多维度种,被选中作为一个基础维度的抽象接口,比如画图种的形状维度
RefinedAbstration 对基础维度属性的实现和拓展
Implementor 实现类的接口,另外维度的抽象接口
ConcreateImpementor 实现类的具体实现和拓展
文章描述桥接模式的前提是:多维度的使用的时候,会以继承派生的方式进行实现。
用画图来说的话,分为形状和颜色。基类存有形状属性,然后派生出各种颜色子类,再派生出不同的颜色。
有一定的开发经验的人就知道上面的实现就是扯淡,就像当于餐馆不能单点某个菜或者主食,必须点固定搭配的套餐。所以很多时候设计模式弄懂了,就感觉很简单,很自然的就使用了。而且在开发的过程中,你可能已经不由自主的根据自己的经验使用了设计模式,而不知道名称,因为名称只是对某种实现方法的一种称谓罢了。设计模式大都可用用生活现象进行解释,只是拿到软件开发种就成为了设计模式。

例子的uml,主食分为面条和米饭,而所提共的菜肴有鱼香茄子、红烧肉、回锅肉。
具体思维的话:
- 点菜的时候会自然的将主食和菜肴进行分开讨论,那么在开发的时候,可用自然的实现这两个维度的接口和派生实现
- 在两维度的接口实现后,只需要选择一个维度作为基础维度,在其中添加另外维度的聚合就行了,就是另外维度的对象,就相当于点菜的时候,我先点主食,再看够不够进行决定,是否需要点菜肴进行补充。
// bridgeModel.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <string>
using namespace std;
#define interface struct
//主食分为面条、米饭
//炒菜分为鱼香茄子、回锅肉。红烧肉三种
interface IDishes
{
virtual void oredr() = 0;
};
class CYuXiang :public IDishes
{
public:
void oredr() { cout << "order disher : YuXiang QieZi." << endl; }
};
class CHuiGuo :public IDishes
{
public:
void oredr() { cout << "order disher : HuiGuo Rou." << endl; }
};
class CHongShao :public IDishes
{
public:
void oredr() { cout << "order disher : HongShao Rou." << endl; }
};
interface IStapleFood
{
protected:
//菜肴对象,可为空
IDishes* m_dishes;
public:
void orderDishes(IDishes* dis) { m_dishes = dis; }
virtual void eatStapleFood() = 0;
};
class CMianTiao : public IStapleFood
{
public:
void eatStapleFood() {
cout << "Staple Food : Mian Tiao." << endl;
if (NULL != m_dishes)
m_dishes->oredr();
}
};
class CMiFan:public IStapleFood
{
public:
void eatStapleFood() {
cout << "Staple Food : Mi Fan." << endl;
if (NULL != m_dishes)
m_dishes->oredr();
}
};
int main()
{
IStapleFood *food = new CMianTiao();
food->orderDishes(new CYuXiang());
food->eatStapleFood();
}
桥接模式是一种设计模式,常用于处理多维度需求。它通过将抽象化与实现化脱耦,使两者独立变化。在点菜场景中,桥接模式类似单点模式或固定桌菜模式,允许灵活组合主食与菜肴。在软件开发中,这种模式通过接口和聚合关系实现类的多维度抽象和扩展,如画图时的形状和颜色。实际开发中,我们可能会不自觉地运用这种模式,而设计模式的名称仅是对其方法的一种命名。
5571

被折叠的 条评论
为什么被折叠?



