理论学习:
今天我在自学桥接模式,以下是学习桥接模式的心得:
面向对象系统设计其实追求的目标也就两个:一是 高内聚,二是 松耦合。高内聚即模块内部的各组成元素之间的结合要紧密,松耦合即模块与模块之间的相互影响要尽量地小,也就是一个模块相对另一个模块的独立性要强,尽量不要出现“牵一发而动全身”的现象!桥接模式就是讨论的系统的“松耦合”问题。桥接模式使用组合的方式将抽象和实现彻底地解耦!这样抽象和实现可以分别独立地变化!这里所谓的“实现”的含义不是指抽象基类的具体子类对抽象基类中的虚函数的实现,这里的“实现”是指怎么通过组合的方式去实现用户的需求!
实例分析:
下面是我自己写的一个例子。现在汽车公司要生产若干种汽车,我们知道每一辆汽车都是由若干个部分组合而成的!汽车的型号是可以变化的,汽车的每个组成部分也是可以变化的! 比如现在客户要你生产一辆大众型号的汽车,具体要求你使用A类型的底盘和B类型的发动机。好了,过了一段时间当你把A类型的底盘和B类型的发动机生产了出来,准备组装成一辆大众型号的汽车的时候,这时情况不妙了,客户的需求变化了,客户要求现在大众型号的汽车把其底盘从原来的A类型换成B类型,把发动机的B类型换成A类型,这时作为汽车生产厂商的你头痛了!! 好不容易把这个A类型的底盘和B类型的发动机生产出来,你现在又不要了,你这不是扯淡吗??? 好了,遇到这种客户你就暂时忍了吧!要是你遇到那种汽车型号和底盘以及发动机三种都要求改变的那种客户你咋办??? 忍能够解决问题吗?? 回答当然是否定的! 但是当我们的实力不够的时候,我们也就只能忍,好歹也是好几十万银子的订单,不能就这么放弃了啊! 谁叫客户是上帝呢??
现在研究生产模式的专家马某某来了,专家说:你们公司的生产模式已经很落后了,现在都21世纪了,讲究的是敏捷生产模式,要对市场和客户的需求要有快速的适应能力。 客户的需求随时都有可能变化!汽车的型号,底盘的类型以及发动机的类型这些不能一成不变而要灵活多变! 最好的做法是对汽车的类型和底盘的类型以及发动机的类型都抽象出一个类,汽车作为一个抽象类,可以派生出大众汽车,奇瑞汽车,奥迪汽车! 汽车底盘作为一个抽象类可以派生出A,B,C三种类型!汽车发动机作为一个抽象类可以派生出A,B,C三种类型!好了!你现在把这些汽车型号,汽车底盘,汽车发动机这三个东西都抽象出来了!采用组合的方式来绝对满足客户随时变化的需求!这样就把客户需求的实现和汽车型号、 汽车底盘、 汽车发动机这些抽象类分离,使得两者可以独立地随意地变化!客户需要改变什么我们就可以用最快的速度满足他的要求!这样做才能使公司在激烈的市场竞争中立于不败之地!
#include<iostream>
#include<string>
using namespace std;
class DiPan
{
public:
virtual void use_dipan() = 0;
};
class DiPan_A :public DiPan
{
public:
virtual void use_dipan()
{
cout << "使用A类型的汽车底盘" << endl;
}
};
class DiPan_B :public DiPan
{
public:
virtual void use_dipan()
{
cout << "使用B类型的汽车底盘" << endl;
}
};
class DiPan_C :public DiPan
{
public:
virtual void use_dipan()
{
cout << "使用C类型的汽车底盘" << endl;
}
};
class Engine
{
public:
virtual void use_engine() = 0;
};
class Engine_A :public Engine
{
public:
virtual void use_engine()
{
cout << "使用A类型的汽车发动机" << endl;
}
};
class Engine_B :public Engine
{
public:
virtual void use_engine()
{
cout << "使用B类型的汽车发动机" << endl;
}
};
class Engine_C :public Engine
{
public:
virtual void use_engine()
{
cout << "使用C类型的汽车发动机" << endl;
}
};
class Car
{
public:
virtual void assemble_car(DiPan*dp,Engine*eg) = 0;
};
class AoDi_Car :public Car
{
public:
virtual void assemble_car(DiPan*dp, Engine*eg)
{
cout <<endl<< "奥迪汽车:" << endl;
dp->use_dipan();
eg->use_engine();
}
};
class QiRui_car :public Car
{
public:
virtual void assemble_car(DiPan*dp, Engine*eg)
{
cout<<endl << "奇瑞汽车:" << endl;
dp->use_dipan();
eg->use_engine();
}
};
class DaZhong_car :public Car
{
public:
virtual void assemble_car(DiPan*dp, Engine*eg)
{
cout <<endl<< "大众汽车:" << endl;
dp->use_dipan();
eg->use_engine();
}
};
int main(void)
{
DiPan*dipan1 = new DiPan_A;
DiPan*dipan2 = new DiPan_B;
DiPan*dipan3 = new DiPan_C;
Engine*engine1 = new Engine_A;
Engine*engine2 = new Engine_B;
Engine*engine3 = new Engine_C;
Car*car1 = new AoDi_Car;
Car*car2 = new QiRui_car;
Car*car3 = new DaZhong_car;
car1->assemble_car(dipan1, engine2);
car2->assemble_car(dipan2, engine3);
car3->assemble_car(dipan3, engine1);
cout << endl;
delete dipan1;
delete dipan2;
delete dipan3;
delete engine1;
delete engine2;
delete engine3;
delete car1;
delete car2;
delete car3;
system("pause");
return 0;
}