#ifndef __BRIDGE_H__
#define __BRIDGE_H__
#include <stdio.h>
//【说明】
// Bridge模式很好的诠释了面向对象的原则:依赖于抽象而非依赖于具体,依赖于抽象就可以独立的变化,极大程度的降低耦合性。
//【定义】
// 桥接模式 : 将抽象部分与实现部分分离,使它们都可以独立的变化。
//【角色】
// Abstraction:抽象类,包含实现类对象的引用。
// RefinedAbstraction:扩充抽象类。
// Implementor:实现类接口。
// ConcreteImplementor:具体实现类。
//【意义】
// 桥接模式分离了抽象部分和实现部分,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,分别定义接口,这有助于系统进行分层设计,从而产生更好的结构化系统。
// Bridge模式的特征是将"类的功能层次结构"与"类的实现层次结构"分离开,这样有利于他们在各自的方向上独立的扩展。
// 当需要增加功能时,只需要在"类的功能层次结构"一侧增加即可,不必对"类的实现层次结构"做任何修改,而且增加后的功能可以被"所有的实现"使用。
//【示例】
//电器和开关的例子
//电器设备的抽象接口(类的实现层次结构)
class iEquipment
{
public:
iEquipment(){ }
virtual ~iEquipment(){ }
public:
virtual void open() = 0;
virtual void close() = 0;
};
//电灯实现了电器设备的接口
class Light : public iEquipment
{
public:
virtual void open();
virtual void close();
};
//电风扇实现了电器设备的接口
class Fan : public iEquipment
{
public:
virtual void open();
virtual void close();
};
//抽象开关(类的功能层次结构),依赖于电器设备的抽象,而不是电器设备的具体,这样就可以在实现时控制不同的电器设备
class iSwitch
{
public:
iSwitch(iEquipment *eq) : m_eq(eq){ }
virtual ~iSwitch() { }
public:
virtual void start() = 0;
virtual void stop() = 0;
protected:
iEquipment *m_eq; //包含类的实现层次结构对象的引用
};
//圆形开关
class RoundSwitch : public iSwitch
{
public:
RoundSwitch(iEquipment *eq) : iSwitch(eq){ }
virtual void start();
virtual void stop();
};
//方形开关
class SquareSwitch : public iSwitch
{
public:
SquareSwitch(iEquipment *eq) : iSwitch(eq){ }
virtual void start();
virtual void stop();
};
void TestBridge();
#endif
#include "Bridge.h"
void Light::open()
{
printf("Light Open. \n");
}
void Light::close()
{
printf("Light Close. \n");
}
void Fan::open()
{
printf("Fan Open. \n");
}
void Fan::close()
{
printf("Fan Close. \n");
}
void RoundSwitch::start()
{
m_eq->open();
}
void RoundSwitch::stop()
{
m_eq->close();
}
void SquareSwitch::start()
{
m_eq->open();
}
void SquareSwitch::stop()
{
m_eq->close();
}
void TestBridge()
{
iEquipment * light = new Light();
iEquipment * fan = new Fan();
iSwitch * roundSwitch = new RoundSwitch(fan);
roundSwitch->start();
iSwitch * squareSwitch = new SquareSwitch(light);
squareSwitch->stop();
delete roundSwitch;
delete squareSwitch;
delete light;
delete fan;
}