版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、设计模式(Design Pattern),张凯 副教授 计算机学院 软件工程系,问题(Problem),学校有教师和工程师,教师 Teacher,工程师 Engineering,问题(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 retu
2、rn income; set income = value; public int VacationDays get return vacationDays; set vacationDays = value; ,问题(Problem),class Teacher : Employee public Teacher(string name, double income,int vacationDays) Name = name; Income = income; VacationDays = vacationDays; ,class Engineer : Employee public Eng
3、ineer(string name, double income,int vacationDays) Name = name; Income = income; VacationDays = vacationDays; ,问题(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.Inco
4、me + , 假期是+ zhangsan.VacationDays); Console.WriteLine(lisi.Name + 的收入是 + lisi.Income + , 假期是 + lisi.VacationDays); Console.ReadKey(); ,如何批量给员工加薪,加假期?,主要内容,访问者模式(Visitor),模式动机 模式名称:访问者模式(Visitor) 对于系统中的某些对象,它们存储在同一个集合中,且具有不同的类型,而且对于该集合中的对象,可以接受一类称为访问者的对象来访问,而且不同的访问者其访问方式有所不同,访问者模式为解决这类问题而诞生。,访问者模式(Vi
5、sitor),模式动机 在实际使用时,对同一集合对象的操作并不是唯一的,对相同的元素对象可能存在多种不同的操作方式。 而且这些操作方式并不稳定,可能还需要增加新的操作,以满足新的业务需求。 此时,访问者模式就是一个值得考虑的解决方案。,访问者模式(Visitor),模式定义 访问者模式(Visitor Pattern):表示一个作用于某对象结构中的各元素的操作。它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式是一种对象行为型模式。,访问者模式(Visitor),模式结构,访问者模式(Visitor),参与者 Vistor:抽象访问者 ConcreteVisitor:
6、具体访问者 Element:抽象元素 ConcreteElement:具体元素 ObjectStructure:对象结构,访问者模式(Visitor),问题(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; publ
7、ic int VacationDays get return vacationDays; set vacationDays = value; abstract public void Accept(Visitor visitor); ,问题(Problem),class Teacher : Employee public Teacher(string name, double income,int vacationDays) Name = name; Income = income; VacationDays = vacationDays; public override void Accep
8、t(Visitor visitor) visitor.Visit(this); ,class Engineer : Employee public Engineer(string name, double income,int vacationDays) Name = name; Income = income; VacationDays = vacationDays; public override void Accept(Visitor visitor) visitor.Visit(this); ,访问者模式(Visitor),abstract class Visitor abstract
9、 public void Visit(Employee element); class IncomeVisitor : Visitor public override void Visit(Employee element) element.Income *= 1.10; Console.WriteLine(element.Name + 的新工资是: + element.Income); class VacationVisitor : Visitor public override void Visit(Employee element) element.VacationDays += 3;
10、Console.WriteLine(element.Name + 的新假期是 + element.VacationDays); ,访问者模式(Visitor),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 v
11、isitor) foreach (Employee e in employees) e.Accept(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 IncomeVis
12、itor(); VacationVisitor v2 = new VacationVisitor(); e.Accept(v1); e.Accept(v2); Console.Read(); ,访问者模式(Visitor),模式结构,访问者模式(Visitor),abstract class Element / Methods abstract public void Accept(Visitor visitor); ,访问者模式(Visitor),class ConcreteElementA : Element / Methods override public void Accept(Vi
13、sitor visitor) visitor.VisitConcreteElementA(this); public void OperationA() ,class ConcreteElementB : Element / Methods override public void Accept(Visitor visitor) visitor.VisitConcreteElementB(this); public void OperationB() ,访问者模式(Visitor),class ObjectStructure / Fields private ArrayList element
14、s = 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); ,访问者模式(Visitor),abstract class Visitor / Methods abstract pub
15、lic void VisitConcreteElementA( ConcreteElementA concreteElementA); abstract public void VisitConcreteElementB( ConcreteElementB concreteElementB); ,访问者模式(Visitor),class ConcreteVisitor1 : Visitor / Methods override public void VisitConcreteElementA( ConcreteElementA concreteElementA) Console.WriteL
16、ine(0 visited by 1, concreteElementA, this); override public void VisitConcreteElementB( ConcreteElementB concreteElementB) Console.WriteLine(0 visited by 1, concreteElementB, this); ,访问者模式(Visitor),class ConcreteVisitor2 : Visitor / Methods override public void VisitConcreteElementA( ConcreteElemen
17、tA concreteElementA) Console.WriteLine(0 visited by 1, concreteElementA, this); override public void VisitConcreteElementB( ConcreteElementB concreteElementB) Console.WriteLine(0 visited by 1, concreteElementB, this); ,访问者模式(Visitor),static void Main(string args) / Setup structure ObjectStructure o
18、= new ObjectStructure(); o.Attach(new ConcreteElementA(); o.Attach(new ConcreteElementB(); / Create visitor objects ConcreteVisitor1 v1 = new ConcreteVisitor1(); ConcreteVisitor2 v2 = new ConcreteVisitor2(); / Structure accepting visitors o.Accept(v1); o.Accept(v2); Console.ReadKey(); ,访问者模式(Visitor
19、),访问者模式的优点如下 访问者模式使得增加新的操作变得很容易。如果一些操作依赖于一个复杂的结构对象的话,那么一般而言,增加新的操作会很复杂。而使用访问者模式,增加新的操作就意味着增加一个新的访问者类,因此将变得很容易。 访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中。 访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。,访问者模式(Visitor),访问者模式的缺点如下 破坏封装。访问者模式要求访问者对象访问并调用每一个节点对象的操作,这隐含了一个对所有节点对象的要求:它们必须暴露一些自己的操作和内部状态。不然,访问者的访问就变得没有意义。由于访问者对象自己会积累访问操作所需的状态,从而使这些状态不再存储在节点对象
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 城乡规划课程设计
- 垃圾邮件分类器机器学习项目课程设计
- 城市拥堵预测数据分析课程设计
- 产品功能与结构课程设计
- Flash读写稳定性设计课程设计
- 保险公司衔训课程设计
- Flash存储系统优化课程设计
- 裁剪衣服直播课程设计
- C语言迷宫多传感器融合课程设计
- 麻醉案例常见试题与详细答案
- 2026年中级群众文化馆员职称评审面试题及答案解析
- 2026综合版《安全员手册》
- 光伏项目材料报验模板
- 义务教育美术(2022版)新课程标准考试测试题及答案
- 2026科粤版九年级化学上学期期末复习知识清单(默写版+解析版)
- 2025年江西省九江市检察院书记员考试试题及答案
- GB/T 47054-2026森林草原防火无人机巡查技术规范
- 2026年北京市门头沟区社区工作者考试真题解析含答案
- 部门管理培训课件
- 医疗安全(不良)事件根本原因分析法活动指南(T-CQAP4002-2024)
- 国家能源集团科研总院社会招聘参考题库新版
评论
0/150
提交评论