bridge pattern -- 桥接模式
Bridge模式又称为Handle/Body模式。
在软件系统中,经常面临着“某些结构复杂的对象”的创建工作,由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。大部分创建型模式,就是为了解决如何向“客户程序”隔离出“这些易变对象”,从而使得“依赖这些易变对象的客户程序”不随着需求的改变而改变。
实例分析
奔驰汽车的制动距离(从这个速度到完全停止所需要的距离)其他因素稳定,是随着轮胎摩擦力不同而不同的。现在用的是米其林轮胎
1 class MichelinWheel 2 { 3 public: 4 MichelinWheel(int q,...); 5 int getLoad( ); 6 private: 7 int qulity; 8 .... 9 }; 10 MichelinWheel::MichelinWheel( int q,....) 11 :quilty(q) 12 {} 13 int MichelinWheel::getLoad( ) 14 { 15 //经过一些列因素和公式得出该轮胎的负载能力 16 ... 17 return load; 18 } 19 20 class BenzCar 21 { 22 public: 23 int getDistance( ) 24 private: 25 MichelinWheel* wheel 26 int speed 27 }; 28 BenzCar::BenzCar(MichelinWheel* w) 29 { 30 wheel=w; 31 } 32 BenzCar::getDistance ( ) 33 { 34 carSpeed=speed; 35 //经过一些列因素和公式得出汽车在某个速度的制动距离 36 ... 37 return distance 38 }
那么这里我们可以看出,BenzCar这个类对MichelinWheel这个类依赖很大,因为得到的制动距离是因轮胎负载力这个参数为主要因素,那么我们一般设计类,就可以抽象化、一般化,如果某个汽车使用MichelinWheel轮胎它的制动距离和上面是一样的。
1 class MichelinWheel 2 { 3 public: 4 MichelinWheel(int q,...); 5 int getFriction( ); 6 private: 7 int qulity; 8 .... 9 }; 10 MichelinWheel::MichelinWheel( int q,....) 11 :quilty(q) 12 {} 13 int MichelinWheel::getFriction( ) 14 { 15 //经过一些列因素和公式得出该轮胎的摩擦力 16 ... 17 return friction; 18 } 19 20 class Car 21 { 22 vritual int getDistance( )=0; 23 }; 24 25 class BenzCar:public Car 26 { 27 public: 28 int getDistance( ) 29 private: 30 MichelinWheel* wheel 31 int speed 32 }; 33 BenzCar::BenzCar(MichelinWheel* w) 34 { 35 wheel=w; 36 } 37 BenzCar::getDistance ( ) 38 { 39 carSpeed=speed; 40 //经过一些列因素和公式得出汽车在某个速度的制动距离 41 ... 42 return distance 43 }
那么现在看来是汽车这个抽象类依赖MichelinWheel这个类,它的制动距离受MichelinWheel这个类的影响。那么现在实际情况是汽车不仅仅使用米其林轮胎,还使用普利司通轮胎和其它等等。如果使用普利司通轮胎,那么摩擦力计算又改变了,所以抽象化,制动距离只依赖与抽象的轮胎中的获得摩擦力的方法了。
1 class Wheel 2 { 3 public: 4 virtual int getFriction( )=0; 5 }; 6 7 class MichelinWheel:public Wheel 8 { 9 public: 10 MichelinWheel(int q,...); 11 int getFriction( ); 12 private: 13 int qulity; 14 .... 15 }; 16 MichelinWheel::MichelinWheel( int q,....) 17 :quilty(q) 18 {} 19 int MichelinWheel::getFriction( ) 20 { 21 //经过一些列因素和公式得出该轮胎的摩擦力 22 ... 23 return friction ; 24 } 25 26 class Car 27 { 28 vritual int getDistance( )=0; 29 }; 30 31 class BenzCar:public Car 32 { 33 public: 34 int getDistance( ) 35 private: 36 Wheel* wheel 37 int speed 38 }; 39 BenzCar::BenzCar(Wheel* w) 40 { 41 wheel=w; 42 } 43 BenzCar::getDistance ( ) 44 { 45 carSpeed=speed; 46 //经过一些列因素和公式得出汽车在某个速度的制动距离 47 ... 48 return distance 49 }