23种设计模式 UML 类图及对应示例代码 (二)
11.DoFactory.GangOfFour.Flyweight.Structural
?
? Flyweight:運(yùn)用共享技術(shù)有效的支持大量細(xì)粒度的對(duì)象。
???????享元模式:FLYWEIGHT在拳擊比賽中指最輕量級(jí)。享元模式以共享的方式高效的支持大量的細(xì)粒度對(duì)象。享元模式能做到共享的關(guān)鍵是區(qū)分內(nèi)蘊(yùn)狀態(tài)和外蘊(yùn)狀態(tài)。內(nèi)蘊(yùn)狀態(tài)存儲(chǔ)在享元內(nèi)部,不會(huì)隨環(huán)境的改變而有所不同。外蘊(yùn)狀態(tài)是隨環(huán)境的改變而改變的。外蘊(yùn)狀態(tài)不能影響內(nèi)蘊(yùn)狀態(tài),它們是相互獨(dú)立的。將可以共享的狀態(tài)和不可以共享的狀態(tài)從常規(guī)類中區(qū)分開來,將不可以共享的狀態(tài)從類里剔除出去。客戶端不可以直接創(chuàng)建被共享的對(duì)象,而應(yīng)當(dāng)使用一個(gè)工廠對(duì)象負(fù)責(zé)創(chuàng)建被共享的對(duì)象。享元模式大幅度的降低內(nèi)存中對(duì)象的數(shù)量。
?
?
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:給定一個(gè)語(yǔ)言,定義它的文法的一種表示,并定義一個(gè)解釋器用于解釋特定文法。
??????解釋器模式:給定一個(gè)語(yǔ)言后,解釋器模式可以定義出其文法的一種表示,并同時(shí)提供一個(gè)解釋器。客戶端可以使用這個(gè)解釋器來解釋這個(gè)語(yǔ)言中的句子。解釋器模式將描述怎樣在有了一個(gè)簡(jiǎn)單的文法后,使用模式設(shè)計(jì)解釋這些語(yǔ)句。在解釋器模式里面提到的語(yǔ)言是指任何解釋器對(duì)象能夠解釋的任何組合。在解釋器模式中需要定義一個(gè)代表文法的命令類的等級(jí)結(jié)構(gòu),也就是一系列的組合規(guī)則。每一個(gè)命令對(duì)象都有一個(gè)解釋方法,代表對(duì)命令對(duì)象的解釋。命令對(duì)象的等級(jí)結(jié)構(gòu)中的對(duì)象的任何排列組合都是一個(gè)語(yǔ)言。
?
?
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:提供一種方法順序訪問一個(gè)聚合對(duì)象中的各種元素,而無需暴露該對(duì)象的內(nèi)部表示。
??????迭代子模式:迭代子模式可以順序訪問一個(gè)聚集中的元素而不必暴露聚集的內(nèi)部表象。多個(gè)對(duì)象聚在一起形成的總體稱之為聚集,聚集對(duì)象是能夠包容一組對(duì)象的容器對(duì)象。迭代子模式將迭代邏輯封裝到一個(gè)獨(dú)立的子對(duì)象中,從而與聚集本身隔開。迭代子模式簡(jiǎn)化了聚集的界面。每一個(gè)聚集對(duì)象都可以有一個(gè)或一個(gè)以上的迭代子對(duì)象,每一個(gè)迭代子的迭代狀態(tài)可以是彼此獨(dú)立的。迭代算法可以獨(dú)立于聚集角色變化。
?
?
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:用一個(gè)中介對(duì)象來封裝一系列的對(duì)象交互。中介者使各對(duì)象不需要顯式相互引用,從而使得耦合松散,可以獨(dú)立改變相互之間的交互。
??????調(diào)停者模式:調(diào)停者模式包裝了一系列對(duì)象相互作用的方式,使得這些對(duì)象不必相互明顯作用。從而使他們可以松散偶合。當(dāng)某些對(duì)象之間的作用發(fā)生改變時(shí),不會(huì)立即影響其他的一些對(duì)象之間的作用。保證這些作用可以彼此獨(dú)立的變化。調(diào)停者模式將多對(duì)多的相互作用轉(zhuǎn)化為一對(duì)多的相互作用。調(diào)停者模式將對(duì)象的行為和協(xié)作抽象化,把對(duì)象在小尺度的行為上與其他對(duì)象的相互作用分開處理。
?
?
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:不破壞封裝的前提下,捕獲對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。
???????? 備忘錄模式:備忘錄對(duì)象是一個(gè)用來存儲(chǔ)另外一個(gè)對(duì)象內(nèi)部狀態(tài)的快照的對(duì)象。備忘錄模式的用意是在不破壞封裝的條件下,將一個(gè)對(duì)象的狀態(tài)捉住,并外部化,存儲(chǔ)起來,從而可以在將來合適的時(shí)候把這個(gè)對(duì)象還原到存儲(chǔ)起來的狀態(tài)。
?
?
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:定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,以便當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生變化時(shí)依賴于它的所有的對(duì)象都得到通知和刷新。
??????觀察者模式:觀察者模式定義了一種一隊(duì)多的依賴關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽某一個(gè)主題對(duì)象。這個(gè)主題對(duì)象在狀態(tài)上發(fā)生變化時(shí),會(huì)通知所有觀察者對(duì)象,使他們能夠自動(dòng)更新自己。
?
?
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:用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過拷貝這個(gè)原型來創(chuàng)建新的對(duì)象。
???????原始模型模式:通過給出一個(gè)原型對(duì)象來指明所要?jiǎng)?chuàng)建的對(duì)象的類型,然后用復(fù)制這個(gè)原型對(duì)象的方法創(chuàng)建出更多同類型的對(duì)象。原始模型模式允許動(dòng)態(tài)的增加或減少產(chǎn)品類,產(chǎn)品類不需要非得有任何事先確定的等級(jí)結(jié)構(gòu),原始模型模式適用于任何的等級(jí)結(jié)構(gòu)。缺點(diǎn)是每一個(gè)類都必須配備一個(gè)克隆方法。
?
?
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:為其他對(duì)象提供一個(gè)代理以控制對(duì)這個(gè)對(duì)象的訪問。
????? 代理模式:代理模式給某一個(gè)對(duì)象提供一個(gè)代理對(duì)象,并由代理對(duì)象控制對(duì)源對(duì)象的引用。代理就是一個(gè)人或一個(gè)機(jī)構(gòu)代表另一個(gè)人或者一個(gè)機(jī)構(gòu)采取行動(dòng)。某些情況下,客戶不想或者不能夠直接引用一個(gè)對(duì)象,代理對(duì)象可以在客戶和目標(biāo)對(duì)象直接起到中介的作用。客戶端分辨不出代理主題對(duì)象與真實(shí)主題對(duì)象。代理模式可以并不知道真正的被代理對(duì)象,而僅僅持有一個(gè)被代理對(duì)象的接口,這時(shí)候代理對(duì)象不能夠創(chuàng)建被代理對(duì)象,被代理對(duì)象必須有系統(tǒng)的其他角色代為創(chuàng)建并傳入。
?
?
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:保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局點(diǎn)。
???????單例模式:單例模式確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例單例模式。單例模式只應(yīng)在有真正的“單一實(shí)例”的需求時(shí)才可使用。
?
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:允許一個(gè)對(duì)象再內(nèi)部狀態(tài)改變的時(shí)候改變它的行為。對(duì)象看起來似乎修改了所屬的類。
???????? 狀態(tài)模式:狀態(tài)模式允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變的時(shí)候改變行為。這個(gè)對(duì)象看上去象是改變了它的類一樣。狀態(tài)模式把所研究的對(duì)象的行為包裝在不同的狀態(tài)對(duì)象里,每一個(gè)狀態(tài)對(duì)象都屬于一個(gè)抽象狀態(tài)類的一個(gè)子類。狀態(tài)模式的意圖是讓一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變的時(shí)候,其行為也隨之改變。狀態(tài)模式需要對(duì)每一個(gè)系統(tǒng)可能取得的狀態(tài)創(chuàng)立一個(gè)狀態(tài)類的子類。當(dāng)系統(tǒng)的狀態(tài)變化時(shí),系統(tǒng)便改變所選的子類。
?
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);
????????}
????}
}
?
設(shè)計(jì)原則及分類介紹:
http://www.cnblogs.com/furenjun/archive/2010/03/01/designPatterns.html
posted on 2008-12-28 03:17 DotNet編程 閱讀(...) 評(píng)論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/furenjun/archive/2008/12/28/DesignPatterns2.html
總結(jié)
以上是生活随笔為你收集整理的23种设计模式 UML 类图及对应示例代码 (二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win8截图后如何把图片一键归零或自动保
- 下一篇: 淡雅的网名122个