c# 設計模式

來源:互聯網
上載者:User

設計模式分類:創建型 結構性 行為性

一。創建型

1.簡單工廠模式

說明:有一個類,決定在單繼承體系結構中,實例化哪個子類。

2.工廠方法模式

說明:有共同的抽象類。一個工廠 產生 一個 對象。關係是一對一的關係。

3.抽象工廠模式

說明:2個抽象,一個是工廠抽象,一個是產品抽象。通過工廠,產生系列產品。

4.單件模式

說明:只有一個全域訪問點。全程只有一個實例。

5.產生器模式

說明:一個指導者Director,也就一個工廠,來決定調用哪個產生器。每一個產生器,得到相同的數據,內部執行不同的

操作(產品組裝的細節),最終構造成一個複雜的產品,或則不同的顯示。

6.原型模式

說明:在需要創建大量類,或則大對象,或則類在創建之後又需要修改的時,可以使用原型模式。相當於 複製 對象。

二。結構性

說明:通過組合類 結構,產生 更大的 類和結構。

1.適配器模式

說明:可以程式的一種介面,轉換成另一種介面。

1.1類適配器

說明:繼承類,並且繼承一個新的介面。

1.2對象適配器

說明:對象組合。把要轉換的類,放到適配器的內部,並且繼承新的介面。

2.橋接模式

說明:相同的數據,不同的顯示方式。客戶端調用是固定的。

一個橋介面Baridge,橋的實現BaridgeList,繼承Baridge,此實現中,包含顯示介面。

一個顯示介面VisList,顯示介面的實現ProductLIst

調用方式:Baridge b=new BaridgeList(實現VisList介面的類ProductLIst);

b.介面,填充數據。

3.組合模式

說明:可以表示 整體-部份層次結構 或則構建數據的樹形表示。其實就是對象的組合結合,這些對象都具有相同的

的介面。如目錄樹,公司組織機構等。

4.裝飾模式:

說明:其實,是對一個類的實例的擴展,不需要創建一個新的對象。可以對含有共同的介面的對象,進行擴展。不需要對

原始的類進行修改。

比如:對於人,可以有學生 教師 。。。,我們可以對人進行裝飾。那麼學生 教師 也具有相同的功能了。

下面是一個例子的代碼:

View Code

   public  abstract class Person    {       public string Name { set; get; }       public int Age { set; get; }    }   public class StudentPerson : Person {       public void DoWork() {           Console.WriteLine("我在學習");       }   }   public class Tearch : Person {       public void DoWork() {           Console.WriteLine("我在教課");       }   }    /// <summary>    /// 裝飾介面    /// </summary>   public interface IDecorator {       void Sleep();   }    /// <summary>    /// 裝飾實現    /// </summary>   public class SleepDecorator : IDecorator {       Person p;       public SleepDecorator(Person p) {           this.p = p;       }       #region IDecorator 成員       public void Sleep()       {           Console.WriteLine("{0}正在睡覺",p.Name);       }       #endregion   }

調用代碼:

     Person p = new StudentPerson() {  Age=12, Name="gsw"};
            IDecorator decorator = new SleepDecorator(p);
            decorator.Sleep();

5.外觀模式facade:

說明:由於子系統是複雜的類,包裝成簡單的封閉的介面。比如odbc,就是實現外觀模式的。各個數據庫廠商實現是

不同的,而且複雜的。倒是通過odbc,提供統一的介面,簡單的介面。

6.享元(Flyweight)模式:

說明:避免非常相似的類的開銷。粒度很小。大部份數據相同,每一個有不同的幾個參數,把不同的存儲在外部,能大幅度的減少不同實例的數量。

 7.代理模式:

說明:將一個複雜的對象或則創建花費較多的時間的對象,表示成一個簡單的對象。

代理對象和實際對象,繼承相同的介面。

三。行為性模式

1.職責鏈

說明:請求在類之間傳遞,直到找到一個可以處理的類。比如:錯誤 幫助系統。

類似:if elseif else 這樣的語句。

繼承類:

View Code

   public abstract  class Charn    {       protected Charn chan;        public void AddCharn(Charn chan) {           this.chan = chan;       }       public Charn() {          }       public abstract void SendToCharn(string message);    }   public class ACharn : Charn {         public override void SendToCharn(string message)       {           if (message.IndexOf("A") >=0)           {               Console.WriteLine("包含字母A");           }           if (chan != null) {               chan.SendToCharn(message);           }       }   }   public class BCharn : Charn   {       public override void SendToCharn(string message)       {           if (message.IndexOf("B") >= 0)           {               Console.WriteLine("包含字母B");           }           if (chan != null)           {               chan.SendToCharn(message);           }       }   }   public class OtherCharn : Charn   {       public override void SendToCharn(string message)       {           if (message.IndexOf("B") < 0 && message.IndexOf("A") < 0)           {               Console.WriteLine("不包含字母A和B");           }           if (chan != null)           {               chan.SendToCharn(message);           }       }   }

工廠類:

View Code

   public  class FactoryCharn    {       public static  Charn GetACharn() {           Charn cha = new ACharn();           Charn chb = new BCharn();           Charn chother = new OtherCharn();           cha.AddCharn(chb);           chb.AddCharn(chother);           return cha;       }    }

代碼調用:

        static void Main(string[] args)
        {
            Charn cha = FactoryCharn.GetACharn();

            cha.SendToCharn("Bhen hao");
            Console.ReadLine();
        }

2.命令模式

說明:將請求和以及引發的操作完全隔離。

使用到的類

View Code

     public abstract class  Command    {         public Command(Receiver receiver) {             this.receiver = receiver;         }         protected Receiver receiver;         public int Long { set; get; }         public  abstract  void Execute();         public abstract  void UnDo();    }     public class WalkCommand : Command {         public WalkCommand(Receiver receiver):base(receiver) { }         public override void Execute()         {             receiver.DoWalk(Long);         }         public override void UnDo()         {             receiver.DoWalk(-Long);         }     }     public class Receiver {         public void DoWalk(int walkLength) {             Console.WriteLine("您走了{0}步",walkLength);         }     }

中間類

View Code

 public   class Client    {     private  List<Command> lst = new List<Command>();     public  void AddCommand(Command command) {         this.lst.Add(command);     }     public void Execute() {         if (lst.Count > 0)         {             foreach (var item in lst)             {                             item.Execute();             }                   }     }     public void UnDo()     {         if (lst.Count > 0)         {             Command command = lst[lst.Count - 1];             command.UnDo();             lst.Remove(command);         }     }    }

客戶端調用

        static void Main(string[] args)        {http://www.cnblogs.com/Teco/admin/EditPosts.aspx?postid=2540892&update=1hi            Receiver receiver = new Receiver();            Client clent = new Client();            clent.AddCommand(new WalkCommand(receiver) { Long = 12 });                      clent.AddCommand(new WalkCommand(receiver) { Long = 13 });            clent.Execute();            clent.UnDo();            Console.ReadLine();         }

 3.解譯器模式

 說明:分析使用者命令,分析一個代數串。

4.迭代器模式

說明:使用一個標準的介面順序訪問一個資料列或集合,而又不需要知道實現細節。c#中的迭代器,需要基礎IEnumerator介面。

5.中介者模式

說明:是一個類,這個類是唯一知道其他類中方法細節的類,在類發生變化時通知中介者,中介者再將這些變化傳遞給其他需要通知的類。

處理類之間的相互作用。

6.備忘錄模式

說明:儲存對象的狀態,以便以後恢複。

7.觀察者模式

說明:這個主題對象在狀態上發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。

8.狀態模式

說明:允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它的類。states抽象類別,有幾個狀態,實現繼承這個類的類。

一個狀態控制類StateMange。states類中包含StateMange屬性。StateMange類中包含states屬性。在繼承的states中的類中,改變狀態。通過StateMange中可以讀取到states的狀態。

9.策略模式

說明:策略模式是對演算法的封裝,是把使用演算法的責任和演算法本身分割開,委派給不同的對象管理。策略模式通常把一個系列的演算法封裝到一系列的策略類裡面,作為一個抽象策略類的子類。用一句話來說,就是:"準備一組演算法,並將每一個演算法封裝起來,使得它們可以互換。"

10.模板方法模式

說明:準備一個抽象類別,將部分邏輯以具體方法以及具體構造子的形式實現,然後聲明一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現。抽象方法,虛方法。

11.訪問者模式

說明:把本該在另一個類中的方法,用到本類中。對類的擴充。

結構圖:

定義:Employee類,其中有一個方法,這個方法是必須的,要擴充的類都要有這個方法:

        public virtual void accept(Visitor v) {
            v.visit(this);
        }

定義Visitor抽象類別。其中有visit方法。

定義VacationVisitor繼承Visitor,在這個類中處理加的方法。getTotalDays

用戶端調用:

VacationVisitor vac = new VacationVisitor();

Employee employee=new Employee("Susan Bear", 55000, 12, 1);

employee.accept(vac);

vac.getTotalDays()得到結果。

 

 

 

 

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.