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.裝飾模式:
說明:其實,是對一個類的實例的擴展,不需要創建一個新的對象。可以對含有共同的接口的對象,進行擴展。不需要對
原始的類進行修改。
比如:對於人,可以有學生 教師 。。。,我們可以對人進行裝飾。那麼學生 教師 也具有相同的功能了。
下面是一個例子的代碼:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 這樣的語句。
繼承類:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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); } } }
工廠類:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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.命令模式
說明:將請求和以及引發的操作完全隔離。
使用到的類
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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); } }
中間類
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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()得到结果。