您好,登錄后才能下訂單哦!
IronMan之橋接
前面的幾個(gè)篇幅都是在講"部件"的生產(chǎn)已經(jīng)簡簡單單的使用,以后可能要對"部件"進(jìn)行升級,不是不對它本身升級,是其它方式的升級,可以讓它配備武器。 有沒有感覺"部件"是越來越強(qiáng)大了,事物的衍變都是有個(gè)過程的嘛,必須要越來越完善,這是"IronMan"設(shè)計(jì)的宗旨。
好了,廢話不多說了,現(xiàn)在所要做的工作就是設(shè)計(jì)好這個(gè)"武器",以便在后面的篇幅中和"部件"很好的結(jié)合在一起。來看一下"武器"的定義:
1 /// <summary> 2 /// 武器 3 /// </summary> 4 public abstract class Weapon 5 { 6 /// <summary> 7 /// *** 8 /// </summary> 9 public abstract void Attack(); 10 } 11 /// <summary> 12 /// 激光武器 13 /// </summary> 14 public class LaserWeapon : Weapon 15 { 16 17 public override void Attack() 18 { 19 //LaserAttack 20 } 21 } 22 /// <summary> 23 /// ×××武器 24 /// </summary> 25 public class MissileWeapon : Weapon 26 { 27 28 public override void Attack() 29 { 30 //MissileAttack 31 } 32 }
這樣看起來好像沒有什么不妥的,因?yàn)槌鲇谠O(shè)計(jì)的全面性和以便于以后的擴(kuò)展,所以要盡可能的想的全面。
"武器"的使用也是要受環(huán)境限制或影響的。在這里怎么表現(xiàn)出來呢?
先假設(shè)兩種壞境的下武器使用,一種是水下,一種是太空中(真空狀態(tài))
1 /// <summary> 2 /// 水下的激光武器 3 /// </summary> 4 public class UnderwaterLaserWeapon : LaserWeapon 5 { 6 public override void Attack() 7 { 8 //邏輯處理 9 base.Attack(); 10 //邏輯處理 11 } 12 } 13 /// <summary> 14 /// 真空狀態(tài)下激光武器 15 /// </summary> 16 public class EmptyLaserWeapon : LaserWeapon 17 { 18 public override void Attack() 19 { 20 //邏輯處理 21 base.Attack(); 22 //邏輯處理 23 } 24 } 25 /// <summary> 26 /// 水下的×××武器 27 /// </summary> 28 public class UnderwaterMissileWeapon : MissileWeapon 29 { 30 public override void Attack() 31 { 32 //邏輯處理 33 base.Attack(); 34 //邏輯處理 35 } 36 } 37 /// <summary> 38 /// 真空下的×××武器 39 /// </summary> 40 public class EmptyMissileWeapon : MissileWeapon 41 { 42 public override void Attack() 43 { 44 //邏輯處理 45 base.Attack(); 46 //邏輯處理 47 } 48 }
看一下圖1所示現(xiàn)在所有類型的結(jié)構(gòu)圖
整體的設(shè)計(jì)是沒有大礙的,在增加一項(xiàng)"武器"類型時(shí)也是沒有問題了,同樣遵循著開閉原則。
如果是在添加一種壞境的時(shí)候也是遵循著開閉原則的,但是違背了類的單一職責(zé)原則,而且這樣的設(shè)計(jì)繼承關(guān)系太多,不易維護(hù)難以擴(kuò)展,如果這個(gè)"武器"是多維的,而且是同時(shí)的向著多維前面變化的,那么這個(gè)"武器"的結(jié)構(gòu)將會變的龐大無比。
現(xiàn)在應(yīng)該是"橋接"大展身手的時(shí)候了,要在"武器"的兩個(gè)(或者更多)變化的方向解耦,把強(qiáng)耦合變成弱聯(lián)系。
實(shí)現(xiàn)
原來"武器"的結(jié)構(gòu)不變,只需要在其中的一個(gè)維度中提取出抽象(實(shí)現(xiàn)類接口),然后"武器"(抽象類)引用從維度中提取出的抽象就好了。
我們來看一下結(jié)構(gòu):
1 /// <summary> 2 /// 環(huán)境 3 /// </summary> 4 public interface IEnvironment 5 { 6 /// <summary> 7 /// 環(huán)境抽象 8 /// </summary> 9 void EnvironmentJudge(); 10 } 11 /// <summary> 12 /// 水下環(huán)境的 13 /// </summary> 14 public class Underwater : IEnvironment 15 { 16 17 public void EnvironmentJudge() 18 { 19 Console.WriteLine("在水下的"); 20 } 21 } 22 /// <summary> 23 /// 真空環(huán)境下的 24 /// </summary> 25 public class Empty : IEnvironment 26 { 27 28 public void EnvironmentJudge() 29 { 30 Console.WriteLine("真空下的"); 31 } 32 }
上面是 環(huán)境維度的結(jié)構(gòu),下面來看"武器"類型維度的結(jié)構(gòu):
1 /// <summary> 2 /// 武器 3 /// </summary> 4 public abstract class Weapon 5 { 6 protected IEnvironment Environment = null; 7 /// <summary> 8 /// *** 9 /// </summary> 10 public abstract void Attack(); 11 } 12 /// <summary> 13 /// 激光武器 14 /// </summary> 15 public class LaserWeapon : Weapon 16 { 17 public LaserWeapon():this(new Underwater()) { }//默認(rèn)使用環(huán)境為水下 18 public LaserWeapon(IEnvironment environment) 19 { 20 base.Environment = environment; 21 } 22 public override void Attack() 23 { 24 //LaserAttack 25 base.Environment.EnvironmentJudge(); 26 Console.WriteLine("激光武器"); 27 } 28 } 29 /// <summary> 30 /// ×××武器 31 /// </summary> 32 public class MissileWeapon : Weapon 33 { 34 public MissileWeapon():this(new Underwater()) { } 35 public MissileWeapon(IEnvironment environment) 36 { 37 base.Environment = environment; 38 } 39 public override void Attack() 40 { 41 //MissileAttack 42 base.Environment.EnvironmentJudge(); 43 Console.WriteLine("×××武器"); 44 } 45 }
如圖2的所示現(xiàn)在的對象結(jié)構(gòu):
類型都已經(jīng)定義完成了,現(xiàn)在來看一下客戶端調(diào)用代碼:
1 //Weapon weapon = new LaserWeapon();//這里已經(jīng)默認(rèn)的是水下壞境了 2 Weapon weapon = new MissileWeapon(new Empty()); 3 weapon.Attack();
結(jié)果如圖3所示:
橋接模式就講到這里. 下一個(gè)篇幅將講到怎么把"武器"安裝到"部件"上使用的“裝飾者模式”。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。