C#设计模式——访问者模式(Visitor Pattern)
2023-09-14 08:58:57 时间
一、概述
由于需求的改变,某些类常常需要增加新的功能,但由于种种原因这些类层次必须保持稳定,不允许开发人员随意修改。对此,访问者模式可以在不更改类层次结构的前提下透明的为各个类动态添加新的功能。
二、访问者模式
访问者模式表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。其结构图如下:
Visitor为每一个ConcreteElement声明一个Visitor操作。
ConcreteVisitor实现了Visitor声明的操作,其定义的行为就是需要动态添加到ConcreteElement中的新功能。
Element定义一个以Visitor为参数的Accept操作。
ConcreteElement实现Accept操作。
ObjectStructure能枚举它的元素,可以提供一个高层接口以允许访问者访问它的元素。
访问者模式通过双重分派(double dispatch)的方法来透明的为各个类添加新的功能,第一重分派是指Accept方法的多态,第二重分派是指Visit方法的多态。
访问者模式的主要缺点在于增添新的Element子类的时候会导致Visitor类发生改变,而且随着Element子类的增加,Visitor类会越来越庞大。
三、示例
我们看一下访问者模式的简单应用。
首先定义一个公司的员工管理系统的基本员工类,这个类层次要求保持稳定,不得随意添加内容。对此就需要给这些类增加一个Accept方法用于将来的动态扩展。
1 public abstract class Emploree 2 { 3 public string Name { get; set; } 4 protected Emploree() { } 5 public Emploree(string name) 6 { 7 Name = name; 8 } 9 public abstract void Accept(Visitor visitor); 10 } 11 12 public class Manager : Emploree 13 { 14 public Manager(string name) 15 { 16 Name = name; 17 } 18 public override void Accept(Visitor visitor) 19 { 20 visitor.Visit(this); 21 } 22 } 23 24 public class Chairman : Emploree 25 { 26 public Chairman(string name) 27 { 28 Name = name; 29 } 30 public override void Accept(Visitor visitor) 31 { 32 visitor.Visit(this); 33 } 34 }
在系统开发的某个时候,需要给员工增加获取工资待遇的方法,具体实现如下:
1 public abstract class Visitor 2 { 3 public abstract void Visit(Manager manager); 4 public abstract void Visit(Chairman chairman); 5 } 6 7 public class Salary : Visitor 8 { 9 public override void Visit(Manager manager) 10 { 11 Console.WriteLine("Manager salary is 100000"); 12 } 13 public override void Visit(Chairman chairman) 14 { 15 Console.WriteLine("Chairman salary is 1000000"); 16 } 17 }
这样,只需使用Emploree. Accept(new Salary())方法即可获取指定员工的工资。
相关文章
- c# mysql executenonquery_C#与数据库访问技术总结(八)之ExecuteNonQuery方法
- c# mysql executenonquery_C#与数据库访问技术之ExecuteNonQuery方法
- C#通过Builder模式造车的案例分享
- 聊聊 C# 中的 Composite 模式(组合模式)
- c#面试题抽象类和接口的区别-金三银四面试:C#程序员经常遇到的30道基础面试题,想你所想
- ORM哪家强?java,c#,php,python,go 逐一对比, 网友直呼:全面客观
- C#中字符串与byte[]相互转换详解编程语言
- C#中using的三种用法
- jQuery获取地址栏参数插件(模仿C#)
- c#设计模式适配器模式详细介绍
- C#观察者模式实例介绍
- c#可变数目参数params实例
- C#的XML两种代码注释实例说明
- c#解压文件的实例方法
- 深入c#工厂模式的详解
- 深入解析c#中枚举类型的定义与使用
- C#正则表达式分解和转换IP地址实例(C#正则表达式大全c#正则表达式语法)
- C#代码设置开机启动示例
- c#事件使用示例详解
- c#操作sqlserver数据库的简单示例
- C#null合并运算符??(双问号)使用示例
- c#桥接模式(bridge结构模式)用法实例
- C#中的事件介绍
- C#开发纽曼USB来电小秘书客户端总结
- C#中struct和class的区别详解
- C#中委托和事件在观察者模式中的应用实例
- C#数组反转与排序实例分析
- C#实现网页截图功能
- C#中的IDisposable模式用法详解
- C#策略模式(StrategyPattern)实例教程
- C#复合模式(CompositePattern)实例教程