设计模式读书笔记(四) Bridge(桥梁)模式

一、模式介绍

GOF 在《设计模式》中给桥梁模式的定义为:将抽象部分与它的实现部分分离,使它 们都可以独立地变化。这里的抽象部分和实现部分不是我们通常认为的父类与子类、接口与 实现类的关系,而是组合关系。也就是说,实现部分是被抽象部分调用,以用来完成(实现) 抽象部分的功能

简单来说,桥梁模式就是为了降低耦合,让抽象与实现相分离,使得两者都能够各自变化

二、例子实现

假设我现在有两台电脑,一台是预装windows系统的,一台是预装ios系统的,其实可以用继承来实现不同的电脑和系统,但是如果是我要生产出3个品牌的电脑,然后每个品牌的电脑有3个不同的系统进行预售,很好理解,如果是继承的方式,我们需要9个子类,但是如果是采用了桥梁的模式,我们就只需要6个子类即可。下面我们来看一个简单的例子:

我们需要有一个Computer的父类,来定义每一台电脑公共的属性,另外,还需要有一个OS的类来实现每一台电脑预装的系统:

class OS;

class Computer
{
public:
    Computer(){};
    virtual ~Computer(){};

    virtual void InstallOS(OS *os) = 0;

protected:
    OS *operaSystem;
};


class Apple :public Computer
{
public :
    Apple();
    ~Apple();

    void InstallOS(OS *os);

};


class Microsoft :public Computer
{
public:
    Microsoft();
    ~Microsoft();

    void InstallOS(OS *os);

};
class OS
{
public:
    OS(){};
    virtual ~OS(){};

    virtual void Work() = 0;
};


class Windows :public OS
{
public:
    Windows();
    ~Windows();

    void Work();
};

class IOS :public OS
{
public:
    IOS();
    ~IOS();

    void Work();
};

下面是实现的部分:

IOS::IOS() :OS()
{

}

IOS::~IOS()
{

}

void IOS::Work()
{
    cout << "I'm working with IOS " << endl;
}


Windows::Windows() :OS()
{

}

Windows::~Windows()
{

}

void Windows::Work()
{
    cout << "I'm working with Windows " << endl;
}
Apple::Apple() :Computer()
{
    cout << "I'm Mac!" << endl;
}

Apple::~Apple()
{
    if (operaSystem)
        delete operaSystem;
}

void Apple::InstallOS(OS *os)
{
    operaSystem = os;
    operaSystem->Work();
}

Microsoft::Microsoft() :Computer()
{
    cout << "I'm Microsoft!" << endl;
}

Microsoft::~Microsoft()
{
    if (operaSystem)
        delete operaSystem;
}

void Microsoft::InstallOS(OS *os)
{
    operaSystem = os;
    operaSystem->Work();
}

接下来是调用部分:

#include "OS.h"
#include "Computer.h"

int main()
{
    Computer *lenovo = new Microsoft();
    lenovo->InstallOS(new Windows());

    Computer *Mac = new Apple();
    Mac->InstallOS(new IOS());

    delete lenovo;
    delete Mac;
    getchar();
}

这样就实现了抽象和实现的分离,关于这次的代码,可以到github上下载:
这里写链接内容

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值