国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

設(shè)計模式之設(shè)計原則(下)

2019-11-17 02:54:40
字體:
供稿:網(wǎng)友

設(shè)計模式之設(shè)計原則(下)

  好久沒有寫博客啦,因最近在忙于弄自己的一個網(wǎng)站,一直沒有時間寫了,在這里跟廣大園友說聲抱歉,今天也正好是中秋節(jié),在這里祝大家節(jié)日快樂!廢話少說,接續(xù)上節(jié)的繼續(xù)寫下去。
  依賴倒置原則(DependenceInversionPRinciple),簡稱DIP:他的核心思想就是在進(jìn)行業(yè)務(wù)設(shè)計時,高層模塊不應(yīng)該依賴于底層模塊,兩者應(yīng)該依賴與抽象,抽象而不依賴于具體實現(xiàn),具體實現(xiàn)應(yīng)該依賴與抽象,這樣會使代碼變得更穩(wěn)定,從而大大提高了程序應(yīng)對業(yè)務(wù)變化的能力。
我們來看一下一個例子來更深刻的理解一下上面的核心思想:
 1 public class Car 2  3     { 4  5         public string CarName; 6  7   8  9         public Car(string carname)10 11         {12 13             this.CarName = carname;14 15         }16 17         public void 駕駛()18 19         {20 21             Console.WriteLine(CarName + ":駕駛");22 23         }24 25  26 27     }28 29  30 31     public class Person32 33     {34 35         public void drive()36 37         {38 39             Car bmw=new Car("BMW");40 41             bmw.駕駛();42 43         }44 45     }

  從上面的例子看一下能發(fā)現(xiàn)Person類依賴與Car類,這樣耦合度高,這樣的話比如說Car類發(fā)生變化時很容易出現(xiàn)問題,比如說哪天這個Person類不想開汽車了想開火車或者飛機時怎么辦,那我們可以改造一下上面的類,Person類不依賴于Car這個具體實現(xiàn),我們要依賴抽象,依賴與交通工具,我們看看代碼:

  1 //交通工具才抽象  2   3     public interface IVehicle  4   5     {  6   7         void 駕駛();  8   9     } 10  11     //汽車 12  13     public class Car : IVehicle 14  15     { 16  17         public string CarName; 18  19   20  21         public Car(string carname) 22  23         { 24  25             this.CarName = carname; 26  27         } 28  29         public void 駕駛() 30  31         { 32  33             Console.WriteLine(CarName + ":駕駛"); 34  35         } 36  37   38  39     } 40  41     //飛機 42  43     public class Plane : IVehicle 44  45     { 46  47         public string PlaneName; 48  49   50  51         public Plane(string carname) 52  53         { 54  55             this.PlaneName = carname; 56  57         } 58  59         public void 駕駛() 60  61         { 62  63             Console.WriteLine(PlaneName + ":駕駛"); 64  65         } 66  67   68  69     } 70  71     //火車 72  73     public class Train : IVehicle 74  75     { 76  77         public string TrainName; 78  79   80  81         public Train(string carname) 82  83         { 84  85             this.TrainName = carname; 86  87         } 88  89         public void 駕駛() 90  91         { 92  93             Console.WriteLine(TrainName + ":駕駛"); 94  95         } 96  97   98  99     }100 101     public class Person102 103     {104 105         private IVehicle machine = null;106 107         public Person(IVehicle _vehicle)108 109         {110 111             machine = _vehicle;112 113         }114 115         public void drive()116 117         {118 119             machine.駕駛();120 121         }122 123     }

類圖如下:

客戶端調(diào)用代碼:

 1  Person person1=new Person(new Car("寶馬")); 2  3   person1.drive(); 4  5  Person person2=new Person(new Plane("飛機")); 6  7  person2.drive(); 8  9 Person person3=new Person(new Train("火車"));10 11  person3.drive();12 13  Console.ReadLine();

輸出結(jié)果如下:

從以上代碼可以看出Person類的駕駛方法來說不需要依賴具體的交通工具,只依賴抽象,具體的哪一個交通工具是從外部傳入的。這樣其實就是抽象編碼。也是依賴倒置的有點。

組合優(yōu)于繼承:他的核心思想就是組合比繼承更大的靈活性和穩(wěn)定結(jié)構(gòu)。

為什么怎么說呢,我們來看看他們各自的優(yōu)缺點:

繼承優(yōu)點:

1)新的實現(xiàn)很容易,因為大部分是繼承而來的。

2)很容易修改和擴展已有的實現(xiàn)

繼承的缺點:

1)打破了封裝,因為基類想子類暴露額具體的實現(xiàn)細(xì)節(jié)。

2)白盒重用,因為基類的內(nèi)部細(xì)節(jié)通常對子類是可見的。

3)當(dāng)父類發(fā)生改變時子類也做出相應(yīng)的改變。

4)不能在運行時修改由父類繼承來的實現(xiàn)。

組合優(yōu)點:

1)被包含對象通過包含他們的類來訪問

2)黑盒重用,因為被包含對象的內(nèi)部細(xì)節(jié)是不可見的

3)很好的封裝

4)每一個類都專注于一個任務(wù)

5)通過獲得和被包含對象的類型相同的對象引用,可以在運行時動態(tài)定義組合的方式

組合缺點:

1)系統(tǒng)可能會包含更過的對象

2)為了使組合時可以使用不同的對象,必須小心的定義接口。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 高邑县| 长白| 连城县| 新郑市| 织金县| 贵阳市| 青田县| 泽库县| 巩义市| 嘉兴市| 于都县| 安溪县| 翁源县| 嘉峪关市| 达日县| 阿图什市| 沙湾县| 娄底市| 涞源县| 平遥县| 阿克| 长乐市| 恩施市| 合作市| 乐东| 牙克石市| 金门县| 郯城县| 株洲市| 五指山市| 昌江| 宁明县| 云南省| 汉川市| 仁布县| 靖江市| 个旧市| 清河县| 平顺县| 武义县| 东海县|