c# 設計模式

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

一。創建型

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()得到结果。

 

 

 

 

 

 

 

 

posted @ 2012-06-09 21:09  無限遐想  阅读(423)  评论(0编辑  收藏  举报