内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

C#設計模式之橋接

IronMan之橋接

成都創(chuàng)新互聯公司網站建設公司一直秉承“誠信做人,踏實做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務為基礎,以質量求生存,以技術求發(fā)展,成交一個客戶多一個朋友!專注中小微企業(yè)官網定制,成都網站建設、成都網站制作,塑造企業(yè)網絡形象打造互聯網企業(yè)效應。

前言

前面的幾個篇幅都是在講"部件"的生產已經簡簡單單的使用,以后可能要對"部件"進行升級,不是不對它本身升級,是其它方式的升級,可以讓它配備武器。 有沒有感覺"部件"是越來越強大了,事物的衍變都是有個過程的嘛,必須要越來越完善,這是"IronMan"設計的宗旨。

 

好了,廢話不多說了,現在所要做的工作就是設計好這個"武器",以便在后面的篇幅中和"部件"很好的結合在一起。來看一下"武器"的定義:


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     }

這樣看起來好像沒有什么不妥的,因為出于設計的全面性和以便于以后的擴展,所以要盡可能的想的全面。
"武器"的使用也是要受環(huán)境限制或影響的。在這里怎么表現出來呢?
先假設兩種壞境的下武器使用,一種是水下,一種是太空中(真空狀態(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所示現在所有類型的結構圖

C#設計模式之橋接

整體的設計是沒有大礙的,在增加一項"武器"類型時也是沒有問題了,同樣遵循著開閉原則。
如果是在添加一種壞境的時候也是遵循著開閉原則的,但是違背了類的單一職責原則,而且這樣的設計繼承關系太多,不易維護難以擴展,如果這個"武器"是多維的,而且是同時的向著多維前面變化的,那么這個"武器"的結構將會變的龐大無比。
現在應該是"橋接"大展身手的時候了,要在"武器"的兩個(或者更多)變化的方向解耦,把強耦合變成弱聯系。

實現

原來"武器"的結構不變,只需要在其中的一個維度中提取出抽象(實現類接口),然后"武器"(抽象類)引用從維度中提取出的抽象就好了。
我們來看一下結構:

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)境維度的結構,下面來看"武器"類型維度的結構:


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()) { }//默認使用環(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的所示現在的對象結構:

C#設計模式之橋接

類型都已經定義完成了,現在來看一下客戶端調用代碼:

1 //Weapon weapon = new LaserWeapon();//這里已經默認的是水下壞境了
2 Weapon weapon = new MissileWeapon(new Empty());
3 weapon.Attack();

結果如圖3所示:

C#設計模式之橋接

橋接模式就講到這里. 下一個篇幅將講到怎么把"武器"安裝到"部件"上使用的“裝飾者模式”。

 

 

 

網站標題:C#設計模式之橋接
本文URL:http://m.rwnh.cn/article14/jepcde.html

成都網站建設公司_創(chuàng)新互聯,為您提供品牌網站建設、網站營銷、虛擬主機、自適應網站、企業(yè)網站制作、外貿網站建設

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

成都app開發(fā)公司
阜南县| 柘城县| 富顺县| 进贤县| 射阳县| 德保县| 巫山县| 苏州市| 那曲县| 新竹市| 阿拉善盟| 大余县| 孟津县| 赣榆县| 江永县| 石柱| 衡南县| 商城县| 泰宁县| 保亭| 容城县| 开封市| 海南省| 招远市| 新竹市| 荃湾区| 林甸县| 祥云县| 那坡县| 东港市| 潮安县| 阿鲁科尔沁旗| 福鼎市| 买车| 喜德县| 平凉市| 东丽区| 托克逊县| 裕民县| 平度市| 广饶县|