<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                1,依賴? ---什么叫依賴,這就叫依賴,我不能離開你,我要調用你,沒有你我實現不了功能,這就是依賴。 ---單項依賴:注意在MVC中Controller是依賴Model的,而Model不依賴Controller。這叫單項依賴 。 2,耦合?()   簡單地說,軟件工程中對象之間的耦合度就是對象之間的依賴性。對象之間的耦合越高,維護成本越高。因此對象的設計應使類和構件之間的耦合最小。   ---耦合:是指兩個或兩個以上的體系或兩種運動形式間通過相互作用而彼此影響以至聯合起來的現象。 耦合可以分為以下幾種,它們之間的耦合度由高到低排列如下: (1) 內容耦合。當一個模塊直接修改或操作另一個模塊的數據時,或一個模塊不通過正常入口而轉入另一個模塊時,這樣的耦合被稱為內容耦合。內容耦合是最高程度的耦合,應該避免使用之。 (2) 公共耦合。兩個或兩個以上的模塊共同引用一個全局數據項,這種耦合被稱為公共耦合。在具有大量公共耦合的結構中,確定究竟是哪個模塊給全局變量賦了一個特定的值是十分困難的。 (3) 外部耦合 。一組模塊都訪問同一全局簡單變量而不是同一全局數據結構,而且不是通過參數表傳遞該全局變量的信息,則稱之為外部耦合。 (4) 控制耦合 。一個模塊通過接口向另一個模塊傳遞一個控制信號,接受信號的模塊根據信號值而進行適當的動作,這種耦合被稱為控制耦合。 (5) 標記耦合 。若一個模塊A通過接口向兩個模塊B和C傳遞一個公共參數,那么稱模塊B和C之間存在一個標記耦合。 (6)!!!重點: 數據耦合。模塊之間通過參數來傳遞數據(依賴倒置原則,依賴注入),那么被稱為數據耦合。數據耦合是最低的一種耦合形式,系統中一般都存在這種類型的耦合,因為為了完成一些有意義的功能,往往需要將某些模塊的輸出數據作為另一些模塊的輸入數據。 (7)!!!最理想化的耦合: 非直接耦合 。兩個模塊之間沒有直接關系,它們之間的聯系完全是通過主模塊的控制和調用來實現的。 !!!重點總結:耦合是影響軟件復雜程度和設計質量的一個重要因素,在設計上我們應采用以下原則:如果模塊間必須存在耦合,就盡量使用數據耦合,少用控制耦合,限制公共耦合的范圍,盡量避免使用內容耦合。 3,耦合和依賴的關系?   耦合就是依賴。    4,重點,如何解耦? ---解耦最有效的方法就是使用接口。其次是抽象類。(下面案例就是用一個接口,一個抽象類實現了解耦。) ---面向對象思想一直在追求的就是解耦,目的就是使軟件系統能夠以更低的代價接受變化,比如增加新業務時,希望不用修改代碼或者少修改。(看下邊這個案例,抽象變化,就解除了耦合。) ---代碼級別的解耦是最常見的,把OOA/OOD(面向對象分析/面向對象設計)做的更好一些,每個類的職責明確,接口功能盡量細分,多使用經典的設計模式,這樣的代碼也比較容易看懂。   (1),一個雙向耦合案例(公司內很多同事上班炒股票,又怕被老板看到,就賄賂前臺,老板來了,前臺就打電話通知給他們。):   class Secretary //前臺秘書類   {     //同事列表組合,用來添加請求幫忙同事。     private IList<StockObserver> observers=new List<StockObserver>();     private string action;     //增加 =110行    public void Attach(StockObserver observer) //注意,這里是從外部傳入對象---即依賴注入,但是還是產生了耦合,因為StockObserver是一個具體類,依賴具體等于把代碼寫死了,類與類之間產生了緊密聯系(耦合),以后假如出現變化,怎么辦?變一次,改一次,這嚴重違背了OCP原則,解決辦法:依賴抽象,依賴抽象才能應對變化,才能避免耦合。 可以和依賴倒轉原則一起記憶:http://www.cnblogs.com/feichengwulai/articles/3620200.html 尤其需要注意的是,即使類是用依賴注入從外部傳入對象,但是傳入的不是抽象對象,也會產生耦合。看情況把,外部傳入的對象能抽象的盡量抽象出來,不要產生耦合。     看最后一個解耦代碼和代碼結構圖,其實就是將兩個類(通知類和觀察者類)抽象化,然后互相依賴抽象編程,就成功解耦了。     {       observers.Add(observer); //有幾個同事請前臺幫忙,就給集合增加幾個同事對象。     }          //通知     public void Notify()     {       foreach(StockObserver o in observers) //老板來時,就給所有的登記的同事們發通知---“老板來了”       {         o.Update();       }     }     //前臺狀態     public string SecretaryAction //字符串屬性,前臺通過電話,所說的話或所做的事     {       get { return action;}       set { action = value;}     }   }   //看股票同事類   class StockObserver   {     private string name;     private Secretary sub; //前臺     public StockObserver(string name,Secretary sub)     {       this.name=name;       this.sub=sub;     }     public void Update() //得到前臺的通知,趕快采取行動。     {       Console.WriteLine("{0}{1}關閉股票行情,繼續工作!",sub.SecretaryAction,name);     }   }   //客戶端程序如下:   static void Main(string[] args)   {     //前臺小姐小王     Secretary xiaowang=new Secretary();     //看股票同事     StockObserver tongshi1=new StockObserver("王菲",xiaowang);     StockObserver tongshi2=new StockObserver("謝霆鋒",xiaowang);     //前臺記下了兩位同事     xiaowang.Attach(tongshi1);     xiaowang.Attach(tongshi2);     //發現老板回來     xiaowang.SecretaryAction="老板回來了";     //通知兩個同事     xiaowang.Notify();     Console.Read();   }   運行結果如下:     老板回來了,王菲 關閉股票行情,繼續工作!     老板回來了,謝霆鋒 關閉股票行情,繼續工作!   ---注意:前臺類和看股票類之間相互耦合了。前臺類要增加觀察者(同事類),觀察者(同事類)需要前臺的狀態。 如果觀察者(同事類)當中還有人想看NBA的網上直播,你的前臺類代碼怎么辦?那就要改動前臺類了。   (2),解耦實踐一   //抽象觀察者,即需要通知的同事(看股票同事和看NBA同事)的抽象父類   abstract class Observer   {     protected string name;     protected Secretary sub;     public StockObserver(string name,Secretary sub)     {       this.name=name;       this.sub=sub;     }     public abstract void Update();   }   //增加兩個具體觀察者   //看股票同事   class StockObserver:Observer   {     public StockObserver(string name,Secretary sub):base(name,sub){}     public override void Update() //得到前臺的通知,趕快采取行動。     {       Console.WriteLine("{0}{1}關閉股票行情,繼續工作!",sub.SecretaryAction,name);     }   }   //看NBA的同事   class NBAObserver:Observer   {     public NBAObserver(string name,Secretary sub):base(name,sub){}     public override void Update() //得到前臺的通知,趕快采取行動。     {       Console.WriteLine("{0}{1}關閉NBA直播,繼續工作!",sub.SecretaryAction,name);     }   }   ---讓兩個觀察者去繼承"抽象觀察者",對于"Update(更新)"的方法做重寫操作。   ---下面是前臺秘書類的編寫,把所有的具體觀察者耦合的地方都改成了抽象觀察者   class Secretary //前臺秘書類   {     //同事列表組合,用來添加請求幫忙同事。     private IList<StockObserver> observers=new List<StockObserver>();     private string action;     //增加     public void Attach(Observer observer) //針對抽象編程,減少了與具體類的耦合     {       observers.Add(observer); //有幾個同事請前臺幫忙,就給集合增加幾個同事對象。     }     //減少     public void Detach(Observer observer)     {       observers.Remove(observer);     }     //通知     public void Notify()     {       foreach(Observer o in observers) //老板來時,就給所有的登記的同事們發通知---“老板來了”       {         o.Update();       }     }     //前臺狀態     public string SecretaryAction //字符串屬性,前臺通過電話,所說的話或所做的事     {       get { return action;}       set { action = value;}     }   }   ---注意看上邊具體觀察者代碼中,有沒有與具體的類耦合的?有,前臺秘書就是一個具體的類,也應該抽象出來。假如前臺來不及打電話了,那么老板就成了具體的通知者(自己通知自己回來了)。所以這里,觀察者也不應該依賴具體的實現,而是一個抽象的通知者。   (2),解耦實踐二(做到了兩者---觀察者和通知者,都不耦合,通過一個接口,一個抽象類,實現了解耦!!!)   ---代碼結構圖如下:   ![](https://img.kancloud.cn/b9/4e/b94ee0cbed05470fb9237e0fa0f6a446_512x220.png)   //通知者接口   interface Subject     {     void Attach(Observer observer);     void Detach(Observer observer);     void Notify();     string SubjectState     {       get;       set;     }   }   //具體的通知類可能是前臺,也可能是老板,他們也許有各自的一些方法,但對于通知者類說,他們是一樣的,所以他們都要去實現這個接口   class Boss:Subject   {     //同事列表組合,用來添加請求幫忙同事。     private IList<StockObserver> observers=new List<StockObserver>();     private string action;     //增加     public void Attach(Observer observer) //針對抽象編程,減少了與具體類的耦合     {       observers.Add(observer); //有幾個同事請前臺幫忙,就給集合增加幾個同事對象。     }     //減少     public void Detach(Observer observer)     {       observers.Remove(observer);     }     //通知     public void Notify()     {       foreach(Observer o in observers)       {         o.Update();       }     }     //老板狀態     public string SubjectState     {       get { return action;}       set { action = value;}     }   }   ---前臺秘書類與老板類類似,略。   ---對于具體的觀察者,需要更改的地方就是把與"前臺"耦合的地方都改成針對抽象通知者。   //抽象觀察者   abstract class Observer   {     protected string name;     protected Subject sub;     public StockObserver(string name,Subject sub) //原來是前臺類,現改成抽象通知者接口     {       this.name=name;       this.sub=sub;     }     public abstract void Update();   }   //看股票同事   class StockObserver:Observer   {     public StockObserver(string name,Subject sub):base(name,sub){} //原來是前臺,現改成抽象通知者     public override void Update() //得到前臺的通知,趕快采取行動。     {       Console.WriteLine("{0}{1}關閉股票行情,繼續工作!",sub.SubjectState,name); //原來是前臺狀態,現改成"抽象通知者狀態"     }   }   //客戶端代碼如下:   //老板胡漢三   Boss huhansan=new Boss();   //看股票同事   StockObserver tongshi1=new StockObserver("王菲",huhansan);   //看NBA的同事   NBAObserver tongshi2=new NBAObserver("謝霆鋒",huhansan);   huhansan.Attach(tongshi1);   huhansan.Attach(tongshi2);      huhansan.Detach(tongshi1); //王菲其實是沒有被老板通知到,所以減去。由于王菲沒有被通知到,所以她被當場抓獲,下場很慘   //老板回來   huhansan.SubjectState="我胡漢三回來了!";   //發出通知   huhansan.Notify();
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看