结构型模式之桥接模式实现

来源:互联网 发布:vb format 日期格式 编辑:程序博客网 时间:2024/06/15 00:58

概念

桥接模式是构造性的设计模式之一。它是基于类的最小设计原则,通过使用封装、聚合以及继承等行为来让不同的职责承担不同的责任。它的主要特点是把抽象与行为实现分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展

角色和职责

桥接模式
client:桥接模式的使用者;
Abstration:抽象类接口,维护对行为实现的引用;
Refined Abstration: Abstration子类;
Implementer:行为实现类接口(Abstration接口定义了基于Implementer接口的更高层次的操作);
ConcreteImplementor: Implementor子类。

适用于:桥接模式是将抽象部分和实现部分分离(解耦合),使他们都可以独立的变化。

车 安装 发动机:不同型号的车,安装不同型号的发动机
图形 填 颜色: 不同形状的图形,填充上 不同的颜色
将“车 安装 发动机”这个抽象 和 实现进行分离;两个名字就设计两个类;
将“图形 填 颜色”这个抽象 和 实现 进行分离;两个名字就设计两个类

案例

1.问题引出:不同的车型,不同型号,安装不同类型的发动机,会引起子类的泛滥

#include<iostream>using namespace std;class MyCar1{public:    virtual void installEngine() = 0;};class BMW5:public MyCar1{public:     virtual void installEngine()    {        cout << "BMW5 350CC" << endl;    }};class BMW6:public MyCar1{public:     virtual void installEngine()    {        cout << "BMW6 400CC" << endl;    }};class Jeep11:public MyCar1{public:     virtual void installEngine()    {        cout << "Jeep11 1100CC" << endl;    }};class Jeep12:public MyCar1{public:     virtual void installEngine()    {        cout << "Jeep12 1200CC" << endl;    }};//试想,不同的车型,不同型号,安装不同类型的发动机,会引起子类的泛滥。int main(void){    Jeep12 *j12 = new Jeep12();    j12->installEngine();    delete j12;    return 0;}

2.改进1:将车安装封装,会不符合开闭原则

#include<iostream>using namespace std;class MyCar2{public:    virtual void installEngine3500() = 0;    virtual void installEngine4000() = 0;    virtual void installEngine1100() = 0;    virtual void installEngine1200() = 0;   };class BMW:public MyCar2{public:    virtual void installEngine3500()    {        cout << "3500CC" << endl;    }    virtual void installEngine4000()    {        cout << "4000CC" << endl;    }    virtual void installEngine1100()    {        cout << "1100CC" << endl;    }    virtual void installEngine1200()    {        cout << "1200CC" << endl;    }};int main(void){    BMW *bmw5 = new BMW();    bmw5->installEngine3500();    return 0;}

3.改进2:需要把抽象和行为实现分开

#include<iostream>using namespace std;class Engine{public:    virtual void installEngine() = 0;};class Engine4000{public:    virtual void installEngine()    {        cout << "安装发动机 Engine4000" << endl;    }};class Engine3500{public:    virtual void installEngine()    {        cout << "安装发动机 Engine3500" << endl;    }};class Car{public:    Car(Engine *pengine)    {        m_engine = pengine;    }    virtual void installEngine() = 0;protected:    Engine *m_engine;};class BMW7{public:    BMW7(Engine *p):Car(p)    {    }    //注意车的安装 和 发动机的安装 不同之处    virtual void installEngine()    {        cout << "BMW7";        m_engine->installEngine();    }};void main163(){    Engine4000 *e4000 = new Engine4000();    BMW7 *bmw7 = new BMW7(e4000);    bmw7->installEngine();    delete bmw7;    delete e4000;}int main(void){    main163();    return 0;}
原创粉丝点击