C#设计模式之23-访问者模式
访问者模式(Vistor Pattern)
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/431 访问。
访问者模式属于行为型模式,表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。
结构对象是使用访问者模式必备条件,而且这个结构对象必须存在遍历自身各个对象的方法。
角色:
1、抽象访问者(Visitor)
为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色,这样访问者就可以通过该元素角色的特定接口直接访问它;
2、具体访问者(Concrete Visitor)
实现Visitor声明的接口;
3、抽象元素(Element)
定义一个接受访问操作,它以一个访问者(Visitor)作为参数;
4、具体元素(Concrete Element )
实现了抽象元素所定义的接受操作接口;
5、结构对象(Object Structure)
可以提供一个高层接口以允许访问者访问它的元素。
示例:
命名空间VistorPattern中包含Student学生基类充当抽象元素,它的3个实现类Kris、Cherry和Harling分别是我的儿子、女儿和侄女的英文名,它们充当具体元素角色。ITeacher接口充当抽象访问者,而Teacher类充当具体访问者。花名册类Roster充当结构对象。本案例尝试使用老师根据花名册来进行家访这样的场景来讲述访问者模式的使用方法。
namespace VistorPattern
public abstract class Student {public string Name { get; protected set; }public Student(string name) {Name = name;}public abstract void Accept(ITeacher teacher);}
学生基类Student,代表抽象元素。
public class Kris : Student {public Kris(string name) : base(name) {}public override void Accept(ITeacher teacher) {teacher.Visit(this);}}
Kris类,代表某一具体学生。
public class Cherry : Student {public Cherry(string name) : base(name) {}public override void Accept(ITeacher teacher) {teacher.Visit(this);}}
Cherry类,代表某一具体学生。
public class Harling : Student {public Harling(string name) : base(name) {}public override void Accept(ITeacher teacher) {teacher.Visit(this);}}
Harling类,代表某一具体学生。
public interface ITeacher {void Visit(Student student);}
ITeacher接口,代表抽象访问者。
public class Teacher : ITeacher {private string _name = null;public Teacher(string name) {_name = name;}public void Visit(Student student) {Console.WriteLine($"Mr.{_name} is going to visit {student.Name}'s home. ");}}
Teacher类,代表具体访问者。
public class Roster {public List<Student> Students { get; private set; }public Roster() {Students = new List<Student> {new Cherry("Cherry"),new Kris("Kris"),new Harling("Harling")};}}
Roster类,代表花名册,充当结构对象,老师根据这个对象来进行家访。
public class Program {public static void Main(string[] args) {Roster roster = new Roster();foreach(var student in roster.Students) {student.Accept(new Teacher("Tony"));}Console.Read();}}
以上是调用方的代码,以下是这个案例的输出结果:
Mr.Tony is going to visit Cherry's home.
Mr.Tony is going to visit Kris's home.
Mr.Tony is going to visit Harling's home.
优点:
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/431 访问。
1、符合单一职责原则,凡是适用访问者模式的场景中,元素类中需要封装在访问者中的操作必定是与元素类本身关系不大且是易变的操作,使用访问者模式一方面符合单一职责原则,另一方面,因为被封装的操作通常来说都是易变的,所以当发生变化时,就可以在不改变元素类本身的前提下,实现对变化部分的扩展;
2、扩展性良好,元素类可以通过接受不同的访问者来实现对不同操作的扩展。
缺点:
1、增加新的元素类变得困难,每增加一个新的元素意味着要在抽象访问者角色中增加一个新的抽象操作,并在每一个具体访问者类中添加相应的具体操作。
使用场景:
1、一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作;
2、需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。Visitor模式使得你可以将相关的操作集中起来 定义在一个类中;
3、当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作;
4、定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。
C#设计模式之23-访问者模式相关推荐
- 设计模式学习之访问者模式
访问者模式,是行为型设计模式之一.访问者模式是一种将数据操作与数据结构分离的设计模式,它可以算是 23 中设计模式中最复杂的一个,但它的使用频率并不是很高,大多数情况下,你并不需要使用访问者模式,但是 ...
- [设计模式] 23 访问者模式 visitor Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对访问者模式是这样说的:表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作.访问 ...
- C++设计模式23——访问者模式
https://blog.csdn.net/CoderAldrich/article/details/83270301 访问者模式 在GOF的<设计模式:可复用面向对象软件的基础>一书中对 ...
- 软件设计模式(23中设计模式)
目录 1. 软件架构设计模式 2. 设计模式特点 3. 设计模式分类 3.1 面向对象设计原则 3.2 5种创建型模式 3.3 7种结构性模式 3.4 11种行为性模式 参考 1. 软件架构设计模式 ...
- 设计模式学习之访问者模式(Visitor,行为型模式)(21)
参考:https://www.cnblogs.com/edisonchou/p/7247990.html 在患者就医时,医生会根据病情开具处方单,很多医院都会存在以下这个流程:划价人员拿到处方单之后根 ...
- C#设计模式系列:访问者模式(Visitor)
1.访问者模式简介 1.1>.定义 作用于某个对象群中各个对象的操作,可以使在不改变对象本身的情况下,定义作用于对象的新操作. 1.2>.使用频率 低 2.访问者模式结构 2.1> ...
- 《研磨设计模式》chap25 访问者模式Visitor(3)联合组合模式+总结
1. 联合组合模式 //抽象的组件对象,相当于访问者模式中的元素对象 public abstract class Component {//接受访问者的访问 public abstract void ...
- 《研磨设计模式》chap25 访问者模式Visitor(2)模式应用到场景
1. 实现 //各种客户的父类 public abstract class Customer { private String customerId;// 客户编号 private String na ...
- 设计模式笔记(24)---访问者模式(行为型)
Gof定义 表示一个作用于某对象结构中的各元素的操作.它可以在不改变各元素的类的前提下定义作用于这些元素的新的操作. 动机 在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法 ...
- Java 设计模式之 Visitor 访问者模式
Visitor 访问者模式适用的场景是,存在某个容器,里面的组成部分不会发生变化,对这些组成部分的访问,不是由这个容器决定,而是交给访问者决定. 举个生活中的例子,比如稻草人,卖包,卖鞋子这些固定的消 ...
最新文章
- python类的静态属性和静态方法_详解Python中的静态方法与类成员方法
- 几种经典的数据排序及其Java实现
- Unicode® Character Name Index
- NB-IoTDTU对比于3G/4G DTU的区别和优势
- 企业数据云公司Cloudera发布CDP私有云,完善整套企业数据云愿景
- 支持专业设计师的高端样机素材网
- Comparator和Comparable (转)
- 斐波那契数列的时间复杂度
- c语言完整表白程序代码,C语言告白代码,一闪一闪亮晶晶~
- 我为什么要学习 Python(2020版)
- quartz 每月一次_Quartz 每月1号,执行规则表达式怎么列?
- pycharm无法import本地安装好的第三方库问题
- 魔百盒CM211-1-晶晨S905L3B芯片系列-红外蓝牙线刷固件及教程
- Java爬虫彼岸桌面壁纸(使用httpClient+Jsoup)
- matplotlib 绘制 虚线线型之间的间隔设置
- 愿所有我和码农们 printf(“前程似锦”)
- 3种Flink State Backed| 你该用哪个?
- PS绘画效果滤镜Snap Art 4
- 微服务探索:nuoyi-cloud(诺伊)
- 苹果退款_苹果如何退款