桥接模式

桥接模式是一种设计模式,常用于处理多维度需求。它通过将抽象化与实现化脱耦,使两者独立变化。在点菜场景中,桥接模式类似单点模式或固定桌菜模式,允许灵活组合主食与菜肴。在软件开发中,这种模式通过接口和聚合关系实现类的多维度抽象和扩展,如画图时的形状和颜色。实际开发中,我们可能会不自觉地运用这种模式,而设计模式的名称仅是对其方法的一种命名。

桥接模式

桥接模式适用于处于两个维度或者多维度需求的情况,比如画图的时候,存在形状和颜色;吃饭的时候,存在小吃、甜品、主食、菜肴等等。

而这个模式放在生活中就是分类讨论的一种罢了,比如你和朋友去吃一顿饭,点菜的时候如果全是固定的主食+菜肴,这对于聚会就很麻烦,因此常常用来解决的方法有两种:

  1. 都可以单点的模式,在点菜的时候就会自然的点几个热菜、主食点什么、喝的要不要
  2. 固定几人桌。但是具体什么菜、主食等等也是分开讨论的。

这种事物的处理方式在软件开放过程中就称为桥接模式。

 

官方点的解释就是【GOF95】桥梁模式的用意是"将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化"。这句话有三个关键词,也就是抽象化、实现化和脱耦。

抽象化:将各个维度进行抽象化,简单来说就是同个维度使用接口进行统一抽象化,开放过程就是继承派生的接口处理,而在聚会就是“主食”、“佳肴”,两个维度实现抽象接口。

实现化:就是将两个维度的具体实现以子类的方式进行实现拓展

脱耦:此处的脱耦简单来说就是将继承改为聚合关系,将强关联变为若关联。

 

Abstraction 多维度种,被选中作为一个基础维度的抽象接口,比如画图种的形状维度

RefinedAbstration 对基础维度属性的实现和拓展

Implementor 实现类的接口,另外维度的抽象接口

ConcreateImpementor 实现类的具体实现和拓展

 

文章描述桥接模式的前提是:多维度的使用的时候,会以继承派生的方式进行实现。

用画图来说的话,分为形状和颜色。基类存有形状属性,然后派生出各种颜色子类,再派生出不同的颜色。

有一定的开发经验的人就知道上面的实现就是扯淡,就像当于餐馆不能单点某个菜或者主食,必须点固定搭配的套餐。所以很多时候设计模式弄懂了,就感觉很简单,很自然的就使用了。而且在开发的过程中,你可能已经不由自主的根据自己的经验使用了设计模式,而不知道名称,因为名称只是对某种实现方法的一种称谓罢了。设计模式大都可用用生活现象进行解释,只是拿到软件开发种就成为了设计模式。

 

例子的uml,主食分为面条和米饭,而所提共的菜肴有鱼香茄子、红烧肉、回锅肉。

具体思维的话:

  1. 点菜的时候会自然的将主食和菜肴进行分开讨论,那么在开发的时候,可用自然的实现这两个维度的接口和派生实现
  2. 在两维度的接口实现后,只需要选择一个维度作为基础维度,在其中添加另外维度的聚合就行了,就是另外维度的对象,就相当于点菜的时候,我先点主食,再看够不够进行决定,是否需要点菜肴进行补充。
// 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();
}

 

 

 

 

 

 

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值