《26 C#设计模式-访问者模式.ppt》由会员分享,可在线阅读,更多相关《26 C#设计模式-访问者模式.ppt(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、www.ChinaSA.infoDDesign esign P Patternsatterns访问者模式访问者模式访问者模式访问者模式刘刘 伟伟(Sunny)weiliu_www.ChinaSA.info大纲w访问者模式概述w访问者模式的结构与实现w访问者模式的应用实例w访问者模式与组合模式联用w访问者模式的优缺点与适用环境www.ChinaSA.info访问者模式概述w医院处方单处理示意图www.ChinaSA.info访问者模式概述w分析处方单:处方单:药品信息的集合,包含一种或多种不同类型的药品信息不同类型的工作人员(例如划价人员和药房工作人员)在操作同一个药品信息集合时将提供不同的处理
2、方式可能会增加新类型的工作人员来操作处方单软件开发:软件开发:处方单处方单 对象结构对象结构药品信息药品信息 元素元素工作人员工作人员 访问者访问者www.ChinaSA.info访问者模式概述w分析对象结构中存储了对象结构中存储了多种不同类型多种不同类型的对象信息的对象信息对同一对象结构中的元素的对同一对象结构中的元素的操作方式并不唯一操作方式并不唯一,可能,可能需要需要提供多种不同的处理方式提供多种不同的处理方式还有可能还有可能增加新的处理方式增加新的处理方式访问者模式访问者模式以不同的方式操以不同的方式操作复杂对象结构作复杂对象结构www.ChinaSA.info访问者模式概述w访问者模
3、式的定义对象行为型对象行为型模式模式访访问问者者模模式式:表示一个作用于某对对象象结结构构中的各个元素的操作。访问者模式让你可可以以在在不不改改变变各各元元素素的的类类的的前前提提下下定定义义作用于作用于这这些元素的新操作些元素的新操作。Visitor Pattern:Represent an operation to be performed on the elements of an object structure.Visitor lets you define a new operation without changing the classes of the elements on
4、 which it operates.www.ChinaSA.info访问者模式概述w访问者模式的定义它为它为操作存储不同类型元素的对象结操作存储不同类型元素的对象结构构提供了一种解决方案提供了一种解决方案用户用户可以对不同类型的元素施加不同可以对不同类型的元素施加不同的操作的操作www.ChinaSA.info访问者模式的结构与实现w访问者模式的结构www.ChinaSA.info访问者模式的结构与实现w访问者模式的结构访问者模式包含以下访问者模式包含以下5个角色:个角色:Visitor(抽象访问者)ConcreteVisitor(具体访问者)Element(抽象元素)ConcreteEle
5、ment(具体元素)ObjectStructure(对象结构)www.ChinaSA.info访问者模式的结构与实现w访问者模式的实现典型的抽象访问者类代码:典型的抽象访问者类代码:abstract class Visitorpublic abstract void Visit(ConcreteElementA elementA);public abstract void Visit(ConcreteElementB elementB);public void Visit(ConcreteElementC elementC)/元素元素ConcreteElementC的的操作操作代代码码www.
6、ChinaSA.info访问者模式的结构与实现w访问者模式的实现典型的具体访问者类代码:典型的具体访问者类代码:class ConcreteVisitor:Visitorpublic override void Visit(ConcreteElementA elementA)/元素ConcreteElementA的操作代码 public override void Visit(ConcreteElementB elementB)/元素ConcreteElementB的操作代码 www.ChinaSA.info访问者模式的结构与实现w访问者模式的实现典型的抽象元素类代码:典型的抽象元素类代码:i
7、nterface Element void Accept(Visitor visitor);www.ChinaSA.info访问者模式的结构与实现w访问者模式的实现典型的具体元素类代码:典型的具体元素类代码:class ConcreteElementA:Element public void Accept(Visitor visitor)visitor.Visit(this);public void OperationA()/业务方法www.ChinaSA.info访问者模式的结构与实现w访问者模式的实现双重分派机制双重分派机制(1)调用具体元素类的Accept(Visitor visitor
8、)方法,并将Visitor子类对象作为其参数(2)在具体元素类Accept(Visitor visitor)方法内部调用传入的Visitor对象的Visit()方法,例如Visit(ConcreteElementA elementA),将当前具体元素类对象(this)作为参数,例如visitor.Visit(this)(3)执行Visitor对象的Visit()方法,在其中还可以调用具体元素对象的业务方法ConcreteElementA.Accept(Visitor visitor)ConcreteVisitorA.Visit(ConcreteElementA elementA)Concret
9、eElementA.OperationA()www.ChinaSA.info访问者模式的结构与实现w访问者模式的实现典型的对象结构代码:典型的对象结构代码:using System;using System.Collections.Generic;class ObjectStructure private List list=new List();/定定义义一一个个集集合合用用于于存存储储元素元素对对象象/接受接受访问访问者的者的访问访问操作操作public void Accept(Visitor visitor)foreach(Object obj in list)(Element)obj)
10、.Accept(visitor);/遍遍历访问历访问集合中的每一个元素集合中的每一个元素 public void AddElement(Element element)list.Add(element);public void RemoveElement(Element element)list.Remove(element);www.ChinaSA.info访问者模式的应用实例w实例说明某公司OA系统中包含一个员工信息管理子系统,该公司员工包括正式员工和临时工,每周人力资源部和财务部等部门需要对员工数据进行汇总,汇总数据包括员工工作时间、员工工资等。该公司基本制度如下:(1)正式员工每周工作
11、时间为40小时,不同级别、不同部门的员工每周基本工资不同;如果超过40小时,超出部分按照100元/小时作为加班费;如果少于40小时,所缺时间按照请假处理,请假所扣工资以80元/小时计算,直到基本工资扣除到零为止。除了记录实际工作时间外,人力资源部需记录加班时长或请假时长,作为员工平时表现的一项依据。(2)临时工每周工作时间不固定,基本工资按小时计算,不同岗位的临时工小时工资不同。人力资源部只需记录实际工作时间。人力资源部和财务部工作人员可以根据各自的需要对员工数据进行汇总处理,人力资源部负责汇总每周员工工作时间,而财务部负责计算每周员工工资。现使用访问者模式设计该系统,绘制类图并使用C#语言编
12、码实现。www.ChinaSA.info访问者模式的应用实例w实例类图员工数据汇总模块结构图员工数据汇总模块结构图www.ChinaSA.info访问者模式的应用实例w实例代码(1)Employee:员工类,充当抽象元素类:员工类,充当抽象元素类(2)FulltimeEmployee:全职员工类,充当具体元素类:全职员工类,充当具体元素类(3)ParttimeEmployee:兼职员工类,充当具体元素类:兼职员工类,充当具体元素类(4)Department:部门类,充当抽象访问者类:部门类,充当抽象访问者类(5)FADepartment:财务部类,充当具体访问者类:财务部类,充当具体访问者类(
13、6)HRDepartment:人力资源部类,充当具体访问者类:人力资源部类,充当具体访问者类(7)EmployeeList:员工列表类,充当对象结构:员工列表类,充当对象结构(8)配置文件配置文件App.config(9)Program:客户端测试类:客户端测试类演示演示演示演示参考代码参考代码(DesignPatternVisitorSample)www.ChinaSA.info访问者模式的应用实例w结果及分析如果需要增加或更换如果需要增加或更换具体访问者类具体访问者类,无须修改源代码,无须修改源代码,只需修改只需修改配置文件配置文件,从,从增加新的访问者增加新的访问者的角度来看,的角度来看
14、,完全完全符合开闭原则符合开闭原则如果要在系统中增加一种新的如果要在系统中增加一种新的具体元素具体元素,必须对原有,必须对原有系统进行修改,在原有的抽象访问者类和具体访问者系统进行修改,在原有的抽象访问者类和具体访问者类中增加相应的访问方法,从类中增加相应的访问方法,从增加新的元素增加新的元素的角度来的角度来看,访问者模式看,访问者模式违背了开闭原则违背了开闭原则开闭原则的倾斜性开闭原则的倾斜性 正式员工张无忌实际工资为:3700元。正式员工杨过实际工资为:2000元。正式员工段誉实际工资为:2240元。临时工洪七公实际工资为:1600元。临时工郭靖实际工资为:1080元。正式员工张无忌实际工
15、作时间为:45小时。正式员工张无忌加班时间为:5小时。正式员工杨过实际工作时间为:40小时。正式员工段誉实际工作时间为:38小时。正式员工段誉请假时间为:2小时。临时工洪七公实际工作时间为:20小时。临时工郭靖实际工作时间为:18小时。www.ChinaSA.info访问者模式与组合模式联用w结构www.ChinaSA.info访问者模式的优缺点与适用环境w模式优点增加新的访问操作很方便增加新的访问操作很方便将有关元素对象的访问行为集中到一将有关元素对象的访问行为集中到一个访问者对象中,而不是分散在一个个访问者对象中,而不是分散在一个个的元素类中,个的元素类中,类的职责更加清晰类的职责更加清晰
16、让用户能够让用户能够在不修改现有元素类层次在不修改现有元素类层次结构的情况下,定义作用于该层次结结构的情况下,定义作用于该层次结构的操作构的操作www.ChinaSA.info访问者模式的优缺点与适用环境w模式缺点增加新的元素类很困难增加新的元素类很困难破坏封装破坏封装www.ChinaSA.info访问者模式的优缺点与适用环境w模式适用环境一个对象结构包含多个类型的对象,一个对象结构包含多个类型的对象,希望对希望对这些对象实施一些依赖其具体类型的操作这些对象实施一些依赖其具体类型的操作需要需要对一个对象结构中的对象进行很多不同对一个对象结构中的对象进行很多不同的且不相关的操作的且不相关的操作,并需要,并需要避免避免让这些操作让这些操作“污染污染”这些对象的类,也不希望在增加新这些对象的类,也不希望在增加新操作时修改这些类操作时修改这些类对象结构中对象对应的类很少改变对象结构中对象对应的类很少改变,但经常,但经常需要在此对象结构上定义新的操作需要在此对象结构上定义新的操作www.ChinaSA.info思考w什么是双重分派机制?如何用代码实现?www.ChinaSA.infoENDEND