定义:将抽象部分与它的实现部分解耦,使得两者都能够独立的变化
就拿我们日常使用的蜡笔来说,蜡笔有不同的大小和颜色,所以我们往往买的蜡笔盒中会有不少的蜡笔。需要用哪个就用哪个,是不是很方便???然而毛笔却不是这样,毛笔分为不同大小,却只有一个调色盘,里面装着不同的颜料。我们需要什么用到什么,就用对应大小的毛笔去蘸对应的颜料。二者想比,哪个更方便呢??我倒是觉得还是蜡笔方便,但是,试想一下,如果我们笔的大小变化有很多,颜色我也要越多越好,以应对变化。那么,我们的蜡笔可能就会多到难以想象,而毛笔只要提供对对应大小的毛笔,颜色只要放到调色盘里就ok了。这样,我们只要带着笔和调色盘就好了,这比带着许多只蜡笔可要方便多了吧。桥接模式,就是要像毛笔这样应对不同(多维度)变化而来的。
桥接模式是一种对象结构性模式,又被称为柄体(handle and body)模式或接口(interface)模式。
1 interface implementor 2 { 3 void operationimpl(); 4 }
1 class concreteimplementor:implementor 2 { 3 public void operationimpl() 4 { 5 //specific business realization 6 } 7 }
1 abstract class abstraction 2 { 3 protected implementor impl; 4 public void setimpl(implementor impl) 5 { 6 this.impl = impl; 7 } 8 9 public abstract void operation(); 10 }
1 class refinedabstraction : abstraction 2 { 3 public override void operation() 4 { 5 //business methods 6 impl.operationimpl(); 7 //business methods 8 } 9 }
上述图可能不那么容易理解,我们看下毛笔的结构示意图:
大小和颜色是两个维度,所以毛笔类为抽象类,在brush类中声明并部分实现毛笔的业务方法,而将各种型号的毛笔作为其子类;颜色与毛笔存在“设置颜色”的关系,所以提供一个颜色接口,而将具体的颜色作为接口的子类。这样,型号的扩展和颜色扩展即可独立,二者又是关联的,方便扩展
注意:color设为protected是为了只让自己的子类才可以使用
应用实例
空客(airbus)、播音(boeing)和麦道(mcdonnell-douglas)都是飞机制造商,他们都生产载客飞机(passenger plane)和载货飞机(cargo plane)。设计一个系统,实现他们
分析:飞机制造商是一个变化点,我们可以定义一个plane抽象类,它的子类就是各种飞机制造商,类中有抽象create方法,再定义一个kindofplane接口,它有createplane的方法,不同类型的飞机种类实现接口方法,这是第二个变化点,plane和接口关联,桥接起来。
结构:
1 using system; 2 using system.collections.generic; 3 using system.linq; 4 using system.text; 5 6 namespace bridgepattern 7 { 8 interface kindofplane//implementor 9 { 10 void createplane(); 11 } 12 class passengerplane : kindofplane//concreteimplementora 13 { 14 15 public void createplane() 16 { 17 console.writeline("create passenger plane"); 18 } 19 } 20 class cargoplane : kindofplane//concreteimplementorb 21 { 22 23 public void createplane() 24 { 25 console.writeline("create cargo plane"); 26 } 27 } 28 abstract class plane//abstraction 29 { 30 protected kindofplane planekind; 31 public void setkind(kindofplane planekind) 32 { 33 this.planekind = planekind; 34 } 35 public abstract void create(); 36 37 } 38 class airbus : plane//refinedabstraction 39 { 40 public override void create() 41 { 42 console.writeline("airbus:"); 43 planekind.createplane(); 44 } 45 } 46 class boeing : plane//refinedabstraction 47 { 48 public override void create() 49 { 50 console.writeline("boeing:"); 51 planekind.createplane(); 52 } 53 } 54 class mcdonnell_douglas : plane//refinedabstraction 55 { 56 public override void create() 57 { 58 console.writeline("mcdonnell_douglas:"); 59 planekind.createplane(); 60 } 61 } 62 class program 63 { 64 static void main(string[] args) 65 { 66 console.writeline("~~~~~~~~~~~~~~~~~~~~~~~~~~~"); 67 kindofplane passengerplane = new passengerplane(); 68 airbus air = new airbus(); 69 air.setkind(passengerplane); 70 air.create(); 71 console.writeline("~~~~~~~~~~~~~~~~~~~~~~~~~~~"); 72 kindofplane cargoplane = new cargoplane(); 73 boeing boe = new boeing(); 74 boe.setkind(cargoplane); 75 boe.create(); 76 console.writeline("~~~~~~~~~~~~~~~~~~~~~~~~~~~"); 77 kindofplane cargpplane2 = new cargoplane(); 78 mcdonnell_douglas mc= new mcdonnell_douglas(); 79 mc.setkind(cargoplane); 80 mc.create(); 81 console.writeline("~~~~~~~~~~~~~~~~~~~~~~~~~~~"); 82 } 83 } 84 }
如对本文有疑问, 点击进行留言回复!!
使用设计模式出任CEO迎娶白富美(2)--老板就喜欢聊设计模式?
网友评论