設計模式分類:創建型 結構性 行為性
一。創建型
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()得到結果。