博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#设计模式——访问者模式(Visitor Pattern)
阅读量:4338 次
发布时间:2019-06-07

本文共 2088 字,大约阅读时间需要 6 分钟。

一、概述

由于需求的改变,某些类常常需要增加新的功能,但由于种种原因这些类层次必须保持稳定,不允许开发人员随意修改。对此,访问者模式可以在不更改类层次结构的前提下透明的为各个类动态添加新的功能。
二、访问者模式
访问者模式表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。其结构图如下:

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 : Emploree13     {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 : Emploree25     {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())方法即可获取指定员工的工资。

转载于:https://www.cnblogs.com/amylis_chen/p/6007909.html

你可能感兴趣的文章
JSP开发模式
查看>>
我的Android进阶之旅------>Android嵌入图像InsetDrawable的使用方法
查看>>
Detours信息泄漏漏洞
查看>>
win32使用拖放文件
查看>>
Android 动态显示和隐藏软键盘
查看>>
raid5什么意思?怎样做raid5?raid5 几块硬盘?
查看>>
【转】how can i build fast
查看>>
null?对象?异常?到底应该如何返回错误信息
查看>>
django登录验证码操作
查看>>
(简单)华为Nova青春 WAS-AL00的USB调试模式在哪里开启的流程
查看>>
图论知识,博客
查看>>
[原创]一篇无关技术的小日记(仅作暂存)
查看>>
20145303刘俊谦 Exp7 网络欺诈技术防范
查看>>
原生和jQuery的ajax用法
查看>>
iOS开发播放文本
查看>>
20145202马超《java》实验5
查看>>
JQuery 事件
查看>>
main(argc,argv[])
查看>>
第四阶段 15_Linux tomcat安装与配置
查看>>
NAS 创建大文件
查看>>