B2) Bridge (桥模式) 定义: 把抽象从实现中分离出来,使得两者可以独立的变化。 字面上很难理解定义的意思,那从另外一个方面来讲,一个对象可以看作是对象本身和对象行为的结合,那么对于一个抽象对象的具体实现,就是对其自身和行为的实现。而将抽象与实现分离,也就是将自身与行为的分离。打个比方,人是个抽象的定义,那人有吃饭这个抽象的行为。对于人的一个实例中国人,吃饭时候用筷子,而印度人用手,美国人用刀叉。这样就有了三个实现,但中国人有时候吃饭也用刀叉,美国人也会用筷子,这时候如果按照原先的方法,又需要生成两个新的实现,如此就变得复杂而混乱。于是,桥模式就有了用武之地。把人本身与吃饭这个行为分离开来,人有不同的实现,如中国人,美国人,而吃饭也有不同的实现,如用筷子,用手。有点像以前考试里面的连线题,左边是某个历史人物(对象),右边是发生的历史事件(行为),用直线连接,这条线就是一座桥,当然可能一个人做过几件事情。那就以人吃饭为例子,来看桥模式的实现方法。下面是人和吃饭的抽象类。 public abstract class Person { private PersonImp personImp; public Person(PersonImp pImp) { personImp = pImp; } public void eat() { personImp.eat(); } public String getCountry() { return "world"; } } public abstract class PresonImp { public abstract void eat(); } 接下来实现人吃饭的行为,筷子和刀叉 public class EatByCS extends PresonImp { public void eat() { // eat by chopsticks } } public class EatByKF extends PresonImp { public void eat() { // eat by knives and forks } } 那么,美国人和中国人的实现就是 public class American extends Person { public String getCountry() { return "America"; } } public class Chinese extends Person { public String getCountry() { return "China"; } } 美国人用筷子吃饭和中国人用刀叉就可以表示为 Person personA = new American(new EatByCS()); personA.eat(); Person personC = new Chinese(new EatByKF()); personC.eat(); 其他不同的对象与行为的组合也可以以此类推,人可以自由派生,吃饭的方法也可以随意改变,两者变化对对方毫无干扰,体现了桥模式的优势。非常有效的对已有对象的利用,结构层次清晰且更加易于扩展,这就是结构模式的用途。
参考: 1、 http://www./designpatterns/bridge.htm(中文、java实例) 2、 http://www./Patterns/PatternBridge.aspx(英文、C#实例、UML) 3、 http://www./tech/DesignPattern/Bridge.html(日文、java实例、UML)推荐
|