設(shè)計(jì)模式訪問(wèn)者模式PPT課件_第1頁(yè)
設(shè)計(jì)模式訪問(wèn)者模式PPT課件_第2頁(yè)
設(shè)計(jì)模式訪問(wèn)者模式PPT課件_第3頁(yè)
設(shè)計(jì)模式訪問(wèn)者模式PPT課件_第4頁(yè)
設(shè)計(jì)模式訪問(wèn)者模式PPT課件_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、問(wèn)題問(wèn)題(Problem)(Problem) 學(xué)校有教師和工程師第1頁(yè)/共31頁(yè)問(wèn)題問(wèn)題(Problem)(Problem) abstract class Employee private string name; private double income; private int vacationDays; public string Name get return name; set name = value; public double Income get return income; set income = value; public int VacationDays get r

2、eturn vacationDays; set vacationDays = value; 第2頁(yè)/共31頁(yè)問(wèn)題問(wèn)題(Problem)(Problem) class Teacher : Employee public Teacher(string name, double income,int vacationDays) Name = name; Income = income; VacationDays = vacationDays; class Engineer : Employee public Engineer(string name, double income,int vacati

3、onDays) Name = name; Income = income; VacationDays = vacationDays; 第3頁(yè)/共31頁(yè)問(wèn)題問(wèn)題(Problem)(Problem) static void Main(string args) Teacher zhangsan = new Teacher(張三, 2500.0, 14); Engineer lisi = new Engineer(李四, 3500.0, 16); Console.WriteLine(zhangsan.Name + 的收入是+ zhangsan.Income + , 假期是+ zhangsan.Vaca

4、tionDays); Console.WriteLine(lisi.Name + 的收入是 + lisi.Income + , 假期是 + lisi.VacationDays); Console.ReadKey(); 如何批量給員工加薪,加假期?第4頁(yè)/共31頁(yè)主要內(nèi)容主要內(nèi)容模式動(dòng)機(jī)與定義1模式結(jié)構(gòu)與分析2模式實(shí)例與解析3模式效果與應(yīng)用4第5頁(yè)/共31頁(yè)訪問(wèn)者模式訪問(wèn)者模式(Visitor)(Visitor) 模式動(dòng)機(jī) 模式名稱:訪問(wèn)者模式(Visitor) 對(duì)于系統(tǒng)中的某些對(duì)象,它們存儲(chǔ)在同一個(gè)集合中,且具有不同的類型,而且對(duì)于該集合中的對(duì)象,可以接受一類稱為訪問(wèn)者的對(duì)象來(lái)訪問(wèn),而且不同的

5、訪問(wèn)者其訪問(wèn)方式有所不同,訪問(wèn)者模式為解決這類問(wèn)題而誕生。第6頁(yè)/共31頁(yè)訪問(wèn)者模式訪問(wèn)者模式(Visitor)(Visitor) 模式動(dòng)機(jī) 在實(shí)際使用時(shí),對(duì)同一集合對(duì)象的操作并不是唯一的,對(duì)相同的元素對(duì)象可能存在多種不同的操作方式。 而且這些操作方式并不穩(wěn)定,可能還需要增加新的操作,以滿足新的業(yè)務(wù)需求。 此時(shí),訪問(wèn)者模式就是一個(gè)值得考慮的解決方案。第7頁(yè)/共31頁(yè)訪問(wèn)者模式訪問(wèn)者模式(Visitor)(Visitor) 模式定義 訪問(wèn)者模式(Visitor Pattern):表示一個(gè)作用于某對(duì)象結(jié)構(gòu)中的各元素的操作。它使我們可以在不改變各元素的類的前提下定義作用于這些元素的新操作。訪問(wèn)者模式

6、是一種對(duì)象行為型模式。第8頁(yè)/共31頁(yè)訪問(wèn)者模式訪問(wèn)者模式(Visitor)(Visitor) 模式結(jié)構(gòu) 第9頁(yè)/共31頁(yè)訪問(wèn)者模式訪問(wèn)者模式(Visitor)(Visitor) 參與者 Vistor:抽象訪問(wèn)者 ConcreteVisitor:具體訪問(wèn)者 Element:抽象元素 ConcreteElement:具體元素 ObjectStructure:對(duì)象結(jié)構(gòu)第10頁(yè)/共31頁(yè)訪問(wèn)者模式訪問(wèn)者模式(Visitor)(Visitor)第11頁(yè)/共31頁(yè)問(wèn)題問(wèn)題(Problem)(Problem) abstract class Employee private string name; pri

7、vate double income; private int vacationDays; public string Name get return name; set name = value; public double Income get return income; set income = value; public int VacationDays get return vacationDays; set vacationDays = value; abstract public void Accept(Visitor visitor); 第12頁(yè)/共31頁(yè)問(wèn)題問(wèn)題(Probl

8、em)(Problem) class Teacher : Employee public Teacher(string name, double income,int vacationDays) Name = name; Income = income; VacationDays = vacationDays; public override void Accept(Visitor visitor) visitor.Visit(this); class Engineer : Employee public Engineer(string name, double income,int vaca

9、tionDays) Name = name; Income = income; VacationDays = vacationDays; public override void Accept(Visitor visitor) visitor.Visit(this); 第13頁(yè)/共31頁(yè)訪問(wèn)者模式訪問(wèn)者模式(Visitor)(Visitor) abstract class Visitor abstract public void Visit(Employee element); class IncomeVisitor : Visitor public override void Visit(E

10、mployee element) element.Income *= 1.10; Console.WriteLine(element.Name + 的新工資是: + element.Income); class VacationVisitor : Visitor public override void Visit(Employee element) element.VacationDays += 3; Console.WriteLine(element.Name + 的新假期是 + element.VacationDays); 第14頁(yè)/共31頁(yè)訪問(wèn)者模式訪問(wèn)者模式(Visitor)(Vis

11、itor) class Employees private ArrayList employees = new ArrayList(); public void Attach(Employee employee) employees.Add(employee); public void Detach(Employee employee) employees.Remove(employee); public void Accept(Visitor visitor) foreach (Employee e in employees) e.Accept(visitor); 第15頁(yè)/共31頁(yè)訪問(wèn)者模

12、式訪問(wèn)者模式(Visitor)(Visitor) static void Main(string args) Teacher zhangsan = new Teacher(張三, 2500.0, 14); Engineer lisi = new Engineer(李四, 3500.0, 16); Employees e = new Employees(); e.Attach(zhangsan); e.Attach(lisi); IncomeVisitor v1 = new IncomeVisitor(); VacationVisitor v2 = new VacationVisitor();

13、e.Accept(v1); e.Accept(v2); Console.Read(); 第16頁(yè)/共31頁(yè)訪問(wèn)者模式訪問(wèn)者模式(Visitor)(Visitor) 模式結(jié)構(gòu) 第17頁(yè)/共31頁(yè)訪問(wèn)者模式訪問(wèn)者模式(Visitor)(Visitor) abstract class Element / Methods abstract public void Accept(Visitor visitor); 第18頁(yè)/共31頁(yè)訪問(wèn)者模式訪問(wèn)者模式(Visitor)(Visitor) class ConcreteElementA : Element / Methods override public

14、 void Accept(Visitor visitor) visitor.VisitConcreteElementA(this); public void OperationA() class ConcreteElementB : Element / Methods override public void Accept(Visitor visitor) visitor.VisitConcreteElementB(this); public void OperationB() 第19頁(yè)/共31頁(yè)訪問(wèn)者模式訪問(wèn)者模式(Visitor)(Visitor) class ObjectStructur

15、e / Fields private ArrayList elements = new ArrayList(); / Methods public void Attach(Element element) elements.Add(element); public void Detach(Element element) elements.Remove(element); public void Accept(Visitor visitor) foreach (Element e in elements) e.Accept(visitor); 第20頁(yè)/共31頁(yè)訪問(wèn)者模式訪問(wèn)者模式(Visit

16、or)(Visitor) abstract class Visitor / Methods abstract public void VisitConcreteElementA( ConcreteElementA concreteElementA); abstract public void VisitConcreteElementB( ConcreteElementB concreteElementB); 第21頁(yè)/共31頁(yè)訪問(wèn)者模式訪問(wèn)者模式(Visitor)(Visitor) class ConcreteVisitor1 : Visitor / Methods override publ

17、ic void VisitConcreteElementA( ConcreteElementA concreteElementA) Console.WriteLine(0 visited by 1, concreteElementA, this); override public void VisitConcreteElementB( ConcreteElementB concreteElementB) Console.WriteLine(0 visited by 1, concreteElementB, this); 第22頁(yè)/共31頁(yè)訪問(wèn)者模式訪問(wèn)者模式(Visitor)(Visitor)

18、 class ConcreteVisitor2 : Visitor / Methods override public void VisitConcreteElementA( ConcreteElementA concreteElementA) Console.WriteLine(0 visited by 1, concreteElementA, this); override public void VisitConcreteElementB( ConcreteElementB concreteElementB) Console.WriteLine(0 visited by 1, concr

19、eteElementB, this); 第23頁(yè)/共31頁(yè)訪問(wèn)者模式訪問(wèn)者模式(Visitor)(Visitor) static void Main(string args) / Setup structure ObjectStructure o = new ObjectStructure(); o.Attach(new ConcreteElementA(); o.Attach(new ConcreteElementB(); / Create visitor objects ConcreteVisitor1 v1 = new ConcreteVisitor1(); ConcreteVisito

20、r2 v2 = new ConcreteVisitor2(); / Structure accepting visitors o.Accept(v1); o.Accept(v2); Console.ReadKey(); 第24頁(yè)/共31頁(yè)訪問(wèn)者模式訪問(wèn)者模式(Visitor)(Visitor) 訪問(wèn)者模式的優(yōu)點(diǎn)如下 訪問(wèn)者模式使得增加新的操作變得很容易。如果一些操作依賴于一個(gè)復(fù)雜的結(jié)構(gòu)對(duì)象的話,那么一般而言,增加新的操作會(huì)很復(fù)雜。而使用訪問(wèn)者模式,增加新的操作就意味著增加一個(gè)新的訪問(wèn)者類,因此將變得很容易。 訪問(wèn)者模式將有關(guān)的行為集中到一個(gè)訪問(wèn)者對(duì)象中,而不是分散到一個(gè)個(gè)的節(jié)點(diǎn)類中。 訪問(wèn)者模式可以跨過(guò)幾個(gè)類的等級(jí)結(jié)構(gòu)訪問(wèn)屬于不同的等級(jí)結(jié)構(gòu)的成員類。 第25頁(yè)/共31頁(yè)訪問(wèn)者模式訪問(wèn)者模式(Visitor)(Visitor) 訪問(wèn)者模式的缺點(diǎn)如下 破壞封裝。訪問(wèn)者模式要求訪問(wèn)者對(duì)象訪問(wèn)并調(diào)用每一個(gè)節(jié)點(diǎn)對(duì)象的操作,這隱含了一個(gè)對(duì)所有節(jié)點(diǎn)對(duì)象的要求:它們必須暴露一些自己的操作和內(nèi)部狀態(tài)。不然,訪問(wèn)者的訪問(wèn)就變得沒(méi)有意義。由于訪問(wèn)者對(duì)象自己會(huì)積累訪問(wèn)操作所需的狀態(tài),從而使這些狀態(tài)不再存儲(chǔ)在節(jié)點(diǎn)對(duì)象中,這也是破壞封裝的。 增加新的節(jié)點(diǎn)類變得很困難。每增加一個(gè)新的節(jié)點(diǎn)都意味

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論