23种设计模式 UML 类图及对应示例代码 (二)
11.DoFactory.GangOfFour.Flyweight.Structural
?
? Flyweight:運用共享技術有效的支持大量細粒度的對象。
???????享元模式:FLYWEIGHT在拳擊比賽中指最輕量級。享元模式以共享的方式高效的支持大量的細粒度對象。享元模式能做到共享的關鍵是區分內蘊狀態和外蘊狀態。內蘊狀態存儲在享元內部,不會隨環境的改變而有所不同。外蘊狀態是隨環境的改變而改變的。外蘊狀態不能影響內蘊狀態,它們是相互獨立的。將可以共享的狀態和不可以共享的狀態從常規類中區分開來,將不可以共享的狀態從類里剔除出去。客戶端不可以直接創建被共享的對象,而應當使用一個工廠對象負責創建被共享的對象。享元模式大幅度的降低內存中對象的數量。
?
?
Codeusing?System;
using?System.Collections;
namespace?DoFactory.GangOfFour.Flyweight.Structural
{
????///?<summary>
????///?MainApp?startup?class?for?Structural?
????///?Flyweight?Design?Pattern.
????///?</summary>
????class?MainApp
????{
????????///?<summary>
????????///?Entry?point?into?console?application.
????????///?</summary>
????????static?void?Main()
????????{
????????????//?Arbitrary?extrinsic?state
????????????int?extrinsicstate?=?22;
????????
????????????FlyweightFactory?factory?=?new?FlyweightFactory();
????????????//?Work?with?different?flyweight?instances
????????????Flyweight?fx?=?factory.GetFlyweight("X");
????????????fx.Operation(--extrinsicstate);
????????????Flyweight?fy?=?factory.GetFlyweight("Y");
????????????fy.Operation(--extrinsicstate);
????????????Flyweight?fz?=?factory.GetFlyweight("Z");
????????????fz.Operation(--extrinsicstate);
????????????UnsharedConcreteFlyweight?fu?=?new?
????????????????UnsharedConcreteFlyweight();
????????????fu.Operation(--extrinsicstate);
????????????//?Wait?for?user
????????????Console.Read();
????????}
????}
????//?"FlyweightFactory"?
????class?FlyweightFactory?
????{
????????private?Hashtable?flyweights?=?new?Hashtable();
????????//?Constructor
????????public?FlyweightFactory()
????????{
????????????flyweights.Add("X",?new?ConcreteFlyweight());????????
????????????flyweights.Add("Y",?new?ConcreteFlyweight());
????????????flyweights.Add("Z",?new?ConcreteFlyweight());
????????}
????????public?Flyweight?GetFlyweight(string?key)
????????{
????????????return((Flyweight)flyweights[key]);?
????????}
????}
????//?"Flyweight"?
????abstract?class?Flyweight?
????{
????????public?abstract?void?Operation(int?extrinsicstate);
????}
????//?"ConcreteFlyweight"?
????class?ConcreteFlyweight?:?Flyweight
????{
????????public?override?void?Operation(int?extrinsicstate)
????????{
????????????Console.WriteLine("ConcreteFlyweight:?"?+?extrinsicstate);
????????}
????}
????//?"UnsharedConcreteFlyweight"?
????class?UnsharedConcreteFlyweight?:?Flyweight
????{
????????public?override?void?Operation(int?extrinsicstate)
????????{
????????????Console.WriteLine("UnsharedConcreteFlyweight:?"?+?
????????????????extrinsicstate);
????????}
????}
}
?
12.DoFactory.GangOfFour.Interpreter.Structural
?
Interpreter:給定一個語言,定義它的文法的一種表示,并定義一個解釋器用于解釋特定文法。
??????解釋器模式:給定一個語言后,解釋器模式可以定義出其文法的一種表示,并同時提供一個解釋器。客戶端可以使用這個解釋器來解釋這個語言中的句子。解釋器模式將描述怎樣在有了一個簡單的文法后,使用模式設計解釋這些語句。在解釋器模式里面提到的語言是指任何解釋器對象能夠解釋的任何組合。在解釋器模式中需要定義一個代表文法的命令類的等級結構,也就是一系列的組合規則。每一個命令對象都有一個解釋方法,代表對命令對象的解釋。命令對象的等級結構中的對象的任何排列組合都是一個語言。
?
?
Codeusing?System;
using?System.Collections;
namespace?DoFactory.GangOfFour.Interpreter.Structural
{
????///?<summary>
????///?MainApp?startup?class?for?Structural?
????///?Interpreter?Design?Pattern.
????///?</summary>
????class?MainApp
????{
????????///?<summary>
????????///?Entry?point?into?console?application.
????????///?</summary>
????????static?void?Main()
????????{
????????????Context?context?=?new?Context();
????????????//?Usually?a?tree?
????????????ArrayList?list?=?new?ArrayList();?
????????????//?Populate?'abstract?syntax?tree'?
????????????list.Add(new?TerminalExpression());
????????????list.Add(new?NonterminalExpression());
????????????list.Add(new?TerminalExpression());
????????????list.Add(new?TerminalExpression());
????????????//?Interpret
????????????foreach?(AbstractExpression?exp?in?list)
????????????{
????????????????exp.Interpret(context);
????????????}
????????????//?Wait?for?user
????????????Console.Read();
????????}
????}
????//?"Context"?
????class?Context?
????{
????}
????//?"AbstractExpression"
????abstract?class?AbstractExpression?
????{
????????public?abstract?void?Interpret(Context?context);
????}
????//?"TerminalExpression"?
????class?TerminalExpression?:?AbstractExpression
????{
????????public?override?void?Interpret(Context?context)????
????????{
????????????Console.WriteLine("Called?Terminal.Interpret()");
????????}
????}
????//?"NonterminalExpression"?
????class?NonterminalExpression?:?AbstractExpression
????{
????????public?override?void?Interpret(Context?context)????
????????{
????????????Console.WriteLine("Called?Nonterminal.Interpret()");
????????}????
????}
}
?
13.DoFactory.GangOfFour.Iterator.Structural
?
Iterator:提供一種方法順序訪問一個聚合對象中的各種元素,而無需暴露該對象的內部表示。
??????迭代子模式:迭代子模式可以順序訪問一個聚集中的元素而不必暴露聚集的內部表象。多個對象聚在一起形成的總體稱之為聚集,聚集對象是能夠包容一組對象的容器對象。迭代子模式將迭代邏輯封裝到一個獨立的子對象中,從而與聚集本身隔開。迭代子模式簡化了聚集的界面。每一個聚集對象都可以有一個或一個以上的迭代子對象,每一個迭代子的迭代狀態可以是彼此獨立的。迭代算法可以獨立于聚集角色變化。
?
?
Codeusing?System;
using?System.Collections;
namespace?DoFactory.GangOfFour.Iterator.Structural
{
????///?<summary>
????///?MainApp?startup?class?for?Structural?
????///?Iterator?Design?Pattern.
????///?</summary>
????class?MainApp
????{
????????///?<summary>
????????///?Entry?point?into?console?application.
????????///?</summary>
????????static?void?Main()
????????{
????????????ConcreteAggregate?a?=?new?ConcreteAggregate();
????????????a[0]?=?"Item?A";
????????????a[1]?=?"Item?B";
????????????a[2]?=?"Item?C";
????????????a[3]?=?"Item?D";
????????????//?Create?Iterator?and?provide?aggregate
????????????ConcreteIterator?i?=?new?ConcreteIterator(a);
????????????Console.WriteLine("Iterating?over?collection:");
????????????
????????????object?item?=?i.First();
????????????while?(item?!=?null)
????????????{
????????????????Console.WriteLine(item);
????????????????item?=?i.Next();
????????????}?
????????????//?Wait?for?user
????????????Console.Read();
????????}
????}
????//?"Aggregate"?
????abstract?class?Aggregate
????{
????????public?abstract?Iterator?CreateIterator();
????}
????//?"ConcreteAggregate"?
????class?ConcreteAggregate?:?Aggregate
????{
????????private?ArrayList?items?=?new?ArrayList();
????????public?override?Iterator?CreateIterator()
????????{
????????????return?new?ConcreteIterator(this);
????????}
????????//?Property
????????public?int?Count
????????{
????????????get{?return?items.Count;?}
????????}
????????//?Indexer
????????public?object?this[int?index]
????????{
????????????get{?return?items[index];?}
????????????set{?items.Insert(index,?value);?}
????????}
????}
????//?"Iterator"
????abstract?class?Iterator
????{
????????public?abstract?object?First();
????????public?abstract?object?Next();
????????public?abstract?bool?IsDone();
????????public?abstract?object?CurrentItem();
????}
????//?"ConcreteIterator"?
????class?ConcreteIterator?:?Iterator
????{
????????private?ConcreteAggregate?aggregate;
????????private?int?current?=?0;
????????//?Constructor
????????public?ConcreteIterator(ConcreteAggregate?aggregate)
????????{
????????????this.aggregate?=?aggregate;
????????}
????????public?override?object?First()
????????{
????????????return?aggregate[0];
????????}
????????public?override?object?Next()
????????{
????????????object?ret?=?null;
????????????if?(current?<?aggregate.Count?-?1)
????????????{
????????????????ret?=?aggregate[++current];
????????????}
????????????
????????????return?ret;
????????}
????????public?override?object?CurrentItem()
????????{
????????????return?aggregate[current];
????????}
????????public?override?bool?IsDone()
????????{
????????????return?current?>=?aggregate.Count???true?:?false?;
????????}
????}
}
?
14.DoFactory.GangOfFour.Mediator.Structural
?
Mediator:用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式相互引用,從而使得耦合松散,可以獨立改變相互之間的交互。
??????調停者模式:調停者模式包裝了一系列對象相互作用的方式,使得這些對象不必相互明顯作用。從而使他們可以松散偶合。當某些對象之間的作用發生改變時,不會立即影響其他的一些對象之間的作用。保證這些作用可以彼此獨立的變化。調停者模式將多對多的相互作用轉化為一對多的相互作用。調停者模式將對象的行為和協作抽象化,把對象在小尺度的行為上與其他對象的相互作用分開處理。
?
?
Codeusing?System;
using?System.Collections;
namespace?DoFactory.GangOfFour.Mediator.Structural
{
????///?<summary>
????///?MainApp?startup?class?for?Structural?
????///?Mediator?Design?Pattern.
????///?</summary>
????class?MainApp
????{
????????///?<summary>
????????///?Entry?point?into?console?application.
????????///?</summary>
????????static?void?Main()
????????{
????????????ConcreteMediator?m?=?new?ConcreteMediator();
????????????ConcreteColleague1?c1?=?new?ConcreteColleague1(m);
????????????ConcreteColleague2?c2?=?new?ConcreteColleague2(m);
????????????m.Colleague1?=?c1;
????????????m.Colleague2?=?c2;
????????????c1.Send("How?are?you?");
????????????c2.Send("Fine,?thanks");
????????????//?Wait?for?user
????????????Console.Read();
????????}
????}
????//?"Mediator"?
????abstract?class?Mediator
????{
????????public?abstract?void?Send(string?message,?
????????????Colleague?colleague);
????}
????//?"ConcreteMediator"?
????class?ConcreteMediator?:?Mediator
????{
????????private?ConcreteColleague1?colleague1;
????????private?ConcreteColleague2?colleague2;
????????public?ConcreteColleague1?Colleague1
????????{
????????????set{?colleague1?=?value;?}
????????}
????????public?ConcreteColleague2?Colleague2
????????{
????????????set{?colleague2?=?value;?}
????????}
????????public?override?void?Send(string?message,?
????????????Colleague?colleague)
????????{
????????????if?(colleague?==?colleague1)
????????????{
????????????????colleague2.Notify(message);
????????????}
????????????else
????????????{
????????????????colleague1.Notify(message);
????????????}
????????}
????}
????//?"Colleague"?
????abstract?class?Colleague
????{
????????protected?Mediator?mediator;
????????//?Constructor
????????public?Colleague(Mediator?mediator)
????????{
????????????this.mediator?=?mediator;
????????}
????}
????//?"ConcreteColleague1"?
????class?ConcreteColleague1?:?Colleague
????{
????????//?Constructor
????????public?ConcreteColleague1(Mediator?mediator)?
????????????:?base(mediator)?
????????{?
????????}
????????public?void?Send(string?message)
????????{
????????????mediator.Send(message,?this);
????????}
????????public?void?Notify(string?message)
????????{
????????????Console.WriteLine("Colleague1?gets?message:?"?
????????????????+?message);
????????}
????}
????//?"ConcreteColleague2"?
????class?ConcreteColleague2?:?Colleague
????{
????????//?Constructor
????????public?ConcreteColleague2(Mediator?mediator)?
????????????:?base(mediator)?
????????{?
????????}
??
????????public?void?Send(string?message)
????????{
????????????mediator.Send(message,?this);
????????}
????????public?void?Notify(string?message)
????????{
????????????Console.WriteLine("Colleague2?gets?message:?"?
????????????????+?message);
????????}
????}
}
?
15.DoFactory.GangOfFour.Memento.Structural
?
Memento:不破壞封裝的前提下,捕獲對象的內部狀態,并在該對象之外保存這個狀態。
???????? 備忘錄模式:備忘錄對象是一個用來存儲另外一個對象內部狀態的快照的對象。備忘錄模式的用意是在不破壞封裝的條件下,將一個對象的狀態捉住,并外部化,存儲起來,從而可以在將來合適的時候把這個對象還原到存儲起來的狀態。
?
?
Codeusing?System;
namespace?DoFactory.GangOfFour.Memento.Structural
{
????///?<summary>
????///?MainApp?startup?class?for?Structural?
????///?Memento?Design?Pattern.
????///?</summary>
????class?MainApp
????{
????????///?<summary>
????????///?Entry?point?into?console?application.
????????///?</summary>
????????static?void?Main()
????????{
????????????Originator?o?=?new?Originator();
????????????o.State?=?"On";
????????????//?Store?internal?state
????????????Caretaker?c?=?new?Caretaker();
????????????c.Memento?=?o.CreateMemento();
????????????//?Continue?changing?originator
????????????o.State?=?"Off";
????????????//?Restore?saved?state
????????????o.SetMemento(c.Memento);
????????????//?Wait?for?user
????????????Console.Read();
????????}
????}
????//?"Originator"?
????class?Originator
????{
????????private?string?state;
????????//?Property
????????public?string?State
????????{
????????????get{?return?state;?}
????????????set
????????????{?
????????????????state?=?value;?
????????????????Console.WriteLine("State?=?"?+?state);
????????????}
????????}
????????public?Memento?CreateMemento()
????????{
????????????return?(new?Memento(state));
????????}
????????public?void?SetMemento(Memento?memento)
????????{
????????????Console.WriteLine("Restoring?state");
????????????State?=?memento.State;
????????}
????}
????//?"Memento"
????class?Memento
????{
????????private?string?state;
????????//?Constructor
????????public?Memento(string?state)
????????{
????????????this.state?=?state;
????????}
????????//?Property
????????public?string?State
????????{
????????????get{?return?state;?}
????????}
????}
????//?"Caretaker"?
????class?Caretaker
????{
????????private?Memento?memento;
????????//?Property
????????public?Memento?Memento
????????{
????????????set{?memento?=?value;?}
????????????get{?return?memento;?}
????????}
????}
}
?
16.DoFactory.GangOfFour.Observer.Structural
?
Observer:定義對象間的一種一對多的依賴關系,以便當一個對象的狀態發生變化時依賴于它的所有的對象都得到通知和刷新。
??????觀察者模式:觀察者模式定義了一種一隊多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態上發生變化時,會通知所有觀察者對象,使他們能夠自動更新自己。
?
?
Codeusing?System;
using?System.Collections;
namespace?DoFactory.GangOfFour.Observer.Structural
{
????///?<summary>
????///?MainApp?startup?class?for?Structural?
????///?Observer?Design?Pattern.
????///?</summary>
????class?MainApp
????{
????????///?<summary>
????????///?Entry?point?into?console?application.
????????///?</summary>
????????static?void?Main()
????????{
????????????//?Configure?Observer?pattern
????????????ConcreteSubject?s?=?new?ConcreteSubject();
????????????s.Attach(new?ConcreteObserver(s,"X"));
????????????s.Attach(new?ConcreteObserver(s,"Y"));
????????????s.Attach(new?ConcreteObserver(s,"Z"));
????????????//?Change?subject?and?notify?observers
????????????s.SubjectState?=?"ABC";
????????????s.Notify();
????????????//?Wait?for?user
????????????Console.Read();
????????}
????}
????//?"Subject"?
????abstract?class?Subject
????{
????????private?ArrayList?observers?=?new?ArrayList();
????????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();
????????????}
????????}
????}
????//?"ConcreteSubject"?
????class?ConcreteSubject?:?Subject
????{
????????private?string?subjectState;
????????//?Property
????????public?string?SubjectState
????????{
????????????get{?return?subjectState;?}
????????????set{?subjectState?=?value;?}
????????}
????}
????//?"Observer"?
????abstract?class?Observer
????{
????????public?abstract?void?Update();
????}
????//?"ConcreteObserver"?
????class?ConcreteObserver?:?Observer
????{
????????private?string?name;
????????private?string?observerState;
????????private?ConcreteSubject?subject;
????????//?Constructor
????????public?ConcreteObserver(
????????????ConcreteSubject?subject,?string?name)
????????{
????????????this.subject?=?subject;
????????????this.name?=?name;
????????}
????????public?override?void?Update()
????????{
????????????observerState?=?subject.SubjectState;
????????????Console.WriteLine("Observer?{0}'s?new?state?is?{1}",
????????????????name,?observerState);
????????}
????????//?Property
????????public?ConcreteSubject?Subject
????????{
????????????get?{?return?subject;?}
????????????set?{?subject?=?value;?}
????????}
????}
}
17.DoFactory.GangOfFour.Prototype.Structural
?
? Prototype:用原型實例指定創建對象的種類,并且通過拷貝這個原型來創建新的對象。
???????原始模型模式:通過給出一個原型對象來指明所要創建的對象的類型,然后用復制這個原型對象的方法創建出更多同類型的對象。原始模型模式允許動態的增加或減少產品類,產品類不需要非得有任何事先確定的等級結構,原始模型模式適用于任何的等級結構。缺點是每一個類都必須配備一個克隆方法。
?
?
Codeusing?System;
namespace?DoFactory.GangOfFour.Prototype.Structural
{
????///?<summary>
????///?MainApp?startup?class?for?Structural
????///?Prototype?Design?Pattern.
????///?</summary>
????class?MainApp
????{
????????///?<summary>
????????///?Entry?point?into?console?application.
????????///?</summary>
????????static?void?Main()
????????{
????????????//?Create?two?instances?and?clone?each
????????????ConcretePrototype1?p1?=?new?ConcretePrototype1("I");
????????????ConcretePrototype1?c1?=?(ConcretePrototype1)p1.Clone();
????????????Console.WriteLine?("Cloned:?{0}",?c1.Id);
????????????ConcretePrototype2?p2?=?new?ConcretePrototype2("II");
????????????ConcretePrototype2?c2?=?(ConcretePrototype2)p2.Clone();
????????????Console.WriteLine?("Cloned:?{0}",?c2.Id);
????????????//?Wait?for?user
????????????Console.Read();
????????}
????}
????//?"Prototype"?
????abstract?class?Prototype
????{
????????private?string?id;
????????//?Constructor
????????public?Prototype(string?id)
????????{
????????????this.id?=?id;
????????}
????????//?Property
????????public?string?Id
????????{
????????????get{?return?id;?}
????????}
????????public?abstract?Prototype?Clone();
????}
????//?"ConcretePrototype1"
????class?ConcretePrototype1?:?Prototype
????{
????????//?Constructor
????????public?ConcretePrototype1(string?id)?:?base(id)?
????????{
????????}
????????public?override?Prototype?Clone()
????????{
????????????//?Shallow?copy
????????????return?(Prototype)this.MemberwiseClone();
????????}
????}
????//?"ConcretePrototype2"
????class?ConcretePrototype2?:?Prototype
????{
????????//?Constructor
????????public?ConcretePrototype2(string?id)?:?base(id)?
????????{
????????}
????????public?override?Prototype?Clone()
????????{
????????????//?Shallow?copy
????????????return?(Prototype)this.MemberwiseClone();
????????}
????}
}
18.DoFactory.GangOfFour.Proxy.Structural
?
Proxy:為其他對象提供一個代理以控制對這個對象的訪問。
????? 代理模式:代理模式給某一個對象提供一個代理對象,并由代理對象控制對源對象的引用。代理就是一個人或一個機構代表另一個人或者一個機構采取行動。某些情況下,客戶不想或者不能夠直接引用一個對象,代理對象可以在客戶和目標對象直接起到中介的作用。客戶端分辨不出代理主題對象與真實主題對象。代理模式可以并不知道真正的被代理對象,而僅僅持有一個被代理對象的接口,這時候代理對象不能夠創建被代理對象,被代理對象必須有系統的其他角色代為創建并傳入。
?
?
Codeusing?System;
namespace?DoFactory.GangOfFour.Proxy.Structural
{
????///?<summary>
????///?MainApp?startup?class?for?Structural
????///?Proxy?Design?Pattern.
????///?</summary>
????class?MainApp
????{
????????///?<summary>
????????///?Entry?point?into?console?application.
????????///?</summary>
????????static?void?Main()
????????{
????????????//?Create?proxy?and?request?a?service
????????????Proxy?proxy?=?new?Proxy();
????????????proxy.Request();
????????????//?Wait?for?user
????????????Console.Read();
????????}
????}
????//?"Subject"?
????abstract?class?Subject?
????{
????????public?abstract?void?Request();????????
????}
????//?"RealSubject"?
????class?RealSubject?:?Subject
????{
????????public?override?void?Request()
????????{
????????????Console.WriteLine("Called?RealSubject.Request()");
????????}
????}
????//?"Proxy"?
????class?Proxy?:?Subject
????{
????????RealSubject?realSubject;
????????public?override?void?Request()
????????{
????????????//?Use?'lazy?initialization'
????????????if?(realSubject?==?null)
????????????{
????????????????realSubject?=?new?RealSubject();
????????????}
????????????realSubject.Request();
????????}????
????}
}
?
19.DoFactory.GangOfFour.Singleton.Structural
?
? Singleton:保證一個類僅有一個實例,并提供一個訪問它的全局點。
???????單例模式:單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統提供這個實例單例模式。單例模式只應在有真正的“單一實例”的需求時才可使用。
?
Codeusing?System;
namespace?DoFactory.GangOfFour.Singleton.Structural
{
????///?<summary>
????///?MainApp?startup?class?for?Structural
????///?Singleton?Design?Pattern.
????///?</summary>
????class?MainApp
????{
????????///?<summary>
????????///?Entry?point?into?console?application.
????????///?</summary>
????????static?void?Main()
????????{
????????????//?Constructor?is?protected?--?cannot?use?new
????????????Singleton?s1?=?Singleton.Instance();
????????????Singleton?s2?=?Singleton.Instance();
????????????if?(s1?==?s2)
????????????{
????????????????Console.WriteLine("Objects?are?the?same?instance");
????????????}
????????????//?Wait?for?user
????????????Console.Read();
????????}
????}
????//?"Singleton"
????class?Singleton
????{
????????private?static?Singleton?instance;
????????//?Note:?Constructor?is?'protected'
????????protected?Singleton()?
????????{
????????}
????????public?static?Singleton?Instance()
????????{
????????????//?Uses?lazy?initialization
????????????if?(instance?==?null)
????????????{
????????????????instance?=?new?Singleton();
????????????}
????????????return?instance;
????????}
????}
}
?
20.DoFactory.GangOfFour.State.Structural
?
State:允許一個對象再內部狀態改變的時候改變它的行為。對象看起來似乎修改了所屬的類。
???????? 狀態模式:狀態模式允許一個對象在其內部狀態改變的時候改變行為。這個對象看上去象是改變了它的類一樣。狀態模式把所研究的對象的行為包裝在不同的狀態對象里,每一個狀態對象都屬于一個抽象狀態類的一個子類。狀態模式的意圖是讓一個對象在其內部狀態改變的時候,其行為也隨之改變。狀態模式需要對每一個系統可能取得的狀態創立一個狀態類的子類。當系統的狀態變化時,系統便改變所選的子類。
?
Codeusing?System;
namespace?DoFactory.GangOfFour.State.Structural
{
????///?<summary>
????///?MainApp?startup?class?for?Structural
????///?State?Design?Pattern.
????///?</summary>
????class?MainApp
????{
????????///?<summary>
????????///?Entry?point?into?console?application.
????????///?</summary>
????????static?void?Main()
????????{
????????????//?Setup?context?in?a?state
????????????Context?c?=?new?Context(new?ConcreteStateA());
????????????//?Issue?requests,?which?toggles?state
????????????c.Request();
????????????c.Request();
????????????c.Request();
????????????c.Request();
????????????//?Wait?for?user
????????????Console.Read();
????????}
????}
????//?"State"?
????abstract?class?State
????{
????????public?abstract?void?Handle(Context?context);
????}
????//?"ConcreteStateA"
????class?ConcreteStateA?:?State
????{
????????public?override?void?Handle(Context?context)
????????{
????????????context.State?=?new?ConcreteStateB();
????????}
????}
????//?"ConcreteStateB"?
????class?ConcreteStateB?:?State
????{
????????public?override?void?Handle(Context?context)
????????{
????????????context.State?=?new?ConcreteStateA();
????????}
????}
????//?"Context"?
????class?Context
????{
????????private?State?state;
????????//?Constructor
????????public?Context(State?state)
????????{
????????????this.State?=?state;
????????}
????????//?Property
????????public?State?State
????????{
????????????get{?return?state;?}
????????????set
????????????{?
????????????????state?=?value;?
????????????????Console.WriteLine("State:?"?+?
????????????????????state.GetType().Name);
????????????}
????????}
????????public?void?Request()
????????{
????????????state.Handle(this);
????????}
????}
}
?
設計原則及分類介紹:
http://www.cnblogs.com/furenjun/archive/2010/03/01/designPatterns.html
posted on 2008-12-28 03:17 DotNet編程 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/furenjun/archive/2008/12/28/DesignPatterns2.html
總結
以上是生活随笔為你收集整理的23种设计模式 UML 类图及对应示例代码 (二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win8截图后如何把图片一键归零或自动保
- 下一篇: 淡雅的网名122个