.NET设计模式访问者模式
一.访问者模式的定义:
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。
二.访问者模式的结构和角色:
1.Visitor 抽象访问者角色,为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色,这样访问者就可以通过该元素角色的特定接口直接访问它。
2.ConcreteVisitor.具体访问者角色,实现Visitor声明的接口。
3.Element 定义一个接受访问操作(accept()),它以一个访问者(Visitor)作为参数。
4.ConcreteElement 具体元素,实现了抽象元素(Element)所定义的接受操作接口。
5.ObjectStructure 结构对象角色,这是使用访问者模式必备的角色。它具备以下特性:能枚举它的元素;可以提供一个高层接口以允许访问者访问它的元素;如有需要,可以设计成一个复合对象或者一个聚集(如一个列表或无序集合)。
三.访问者模式的实现:
在生活中,我们要去医院看病,当我们挂号找到主治医生的医生看完病以后,会给你开一张药单,这个时候你需要先去付费,由划价医生收取药费,然后你拿着付费单再去找抓药师抓药。传统上我们也许会,写一个划价师类,里面根据药的名称做判断收取多少费用;写一个抓药师根据药单上面名称要判断去哪里抓药。可能使用Switch进行判断,这样增加了药就要改变划价人员和药房工作者的代码。
访问者模式的目的是封装一些施加于某种数据结构元素之上的操作,一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。为不同类型的元素提供多种访问操作方式,且可以在不修改原有系统的情况下增加新的操作方式,这就是访问者模式的模式动机。
/// <summary>
/// 抽象访问者
/// </summary>
public abstract class Visitor
{
protected string name { get; set; } public Visitor(string name)
{
this.name = name;
} public abstract void visitor(MedicineA a); public abstract void visitor(MedicineB b);
} // 何问起 hovertree.com
/// <summary>
/// 具体访问者:划价员
/// </summary>
public class Charger :Visitor
{
public Charger(string name) : base(name) { } public override void visitor(MedicineA a)
{
Console.WriteLine("划价员:"+this.name+"给药"+a.GetName()+"价格:"+a.GetPrice());
} public override void visitor(MedicineB b)
{
Console.WriteLine("划价员:" + this.name + "给药" + b.GetName() + "价格:" + b.GetPrice());
}
} // 何问起 hovertree.com
/// <summary>
/// 具体访问者:药房工作者
/// </summary>
public class WorkerOfPharmacy:Visitor
{
public WorkerOfPharmacy(string name) : base(name) { }
public override void visitor(MedicineA a)
{
Console.WriteLine("药房工作者:"+this.name+",拿药:"+a.GetName());
} public override void visitor(MedicineB b)
{
Console.WriteLine("药房工作者:" + this.name + ",拿药:" + b.GetName());
}
} // 何问起 hovertree.com
/// <summary>
/// 抽象元素:药
/// </summary>
public abstract class Medicine
{
protected string name { get; set; }
protected double price { get; set; } public Medicine(string name, double price)
{
this.name = name;
this.price = price;
} public string GetName()
{
return name;
} public double GetPrice()
{
return price;
} public void SetPrice(double price)
{
this.price = price;
} public abstract void accept(Visitor visitor);
} // 何问起 hovertree.com
/// <summary>
/// 具体元素:A名称药
/// </summary>
public class MedicineA:Medicine
{
public MedicineA(string name, double price) : base(name, price) { } public override void accept(Visitor visitor)
{
visitor.visitor(this);
}
} // 何问起 hovertree.com
/// <summary>
/// 具体元素:B名称药
/// </summary>
public class MedicineB:Medicine
{
public MedicineB(string name, double price) : base(name, price) { } public override void accept(Visitor visitor)
{
visitor.visitor(this);
}
} // 何问起 hovertree.com
/// <summary>
/// 具体元素:药单
/// </summary>
public class Presciption
{
private List<Medicine> listmedicine = new List<Medicine>();
public void accpet(Visitor visitor)
{
foreach (var item in listmedicine)
{
item.accept(visitor);
}
} public void add(Medicine med)
{
listmedicine.Add(med);
} public void remove(Medicine med)
{
listmedicine.Remove(med);
}
} // 何问起 hovertree.com
/// <summary>
/// C#设计模式-访问者模式
/// </summary>
class Program
{
static void Main(string[] args)
{
//药类型
Medicine a = new MedicineA("药A", );
MedicineB b = new MedicineB("药B", ); //药单
Presciption presciption = new Presciption();
presciption.add(a);
presciption.add(b); Visitor charger = new Charger("张三"); //划价员
Visitor workerOfPharmacy = new WorkerOfPharmacy("李四"); //抓药员 presciption.accpet(charger); //划价
Console.WriteLine();
presciption.accpet(workerOfPharmacy); //抓药
}
} // 何问起 hovertree.com
四.访问者模式优缺点:
优点:
1、使得新增新的访问操作变得更加简单。
2、能够使得用户在不修改现有类的层次结构下,定义该类层次结构的操作。
3、将有关元素对象的访问行为集中到一个访问者对象中,而不是分散搞一个个的元素类中。
缺点:
1、增加新的元素类很困难。在访问者模式中,每增加一个新的元素类都意味着要在抽象访问者角色中增加一个新的抽象操作,并在每一个具体访问者类中增加相应的具体操作,违背了“开闭原则”的要求。
2、破坏封装。当采用访问者模式的时候,就会打破组合类的封装。
3、比较难理解
五.使用场景:
1、对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。
2、需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作“污染”这些对象的类,也不希望在增加新操作时修改这些类。
http://www.cnblogs.com/roucheng/p/3521864.html
.NET设计模式访问者模式的更多相关文章
- C#设计模式-访问者模式
一. 访问者(Vistor)模式 访问者模式是封装一些施加于某种数据结构之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以保存不变.访问者模式适用于数据结构相对稳定的系统, 它把数据结 ...
- JAVA 设计模式 访问者模式
用途 访问者模式 (Visitor) 表示一个作用于某对象结构中的各元素的操作. 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 访问者模式是一种行为型模式. 用途
- 深入浅出设计模式——访问者模式(Visitor Pattern)
模式动机 对于系统中的某些对象,它们存储在同一个集合中,且具有不同的类型,而且对于该集合中的对象,可以接受一类称为访问者的对象来访问,而且不同的访问者其访问方式有所不同,访问者模式为解决这类问题而诞生 ...
- java设计模式---访问者模式
Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自 己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广 泛,遵循一定的编程模式,才能使自 ...
- C++设计模式——访问者模式
访问者模式 在GOF的<设计模式:可复用面向对象软件的基础>一书中对访问者模式是这样说的:表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的 ...
- 设计模式 -- 访问者模式(Visitor)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------主要内容包括: 初识访问者模 ...
- Java设计模式—访问者模式
原文地址:http://www.cnblogs.com/java-my-life/archive/2012/06/14/2545381.html 总结的太棒啦,导致自己看了都不想总结了...... 在 ...
- C#设计模式——访问者模式(Visitor Pattern)
一.概述由于需求的改变,某些类常常需要增加新的功能,但由于种种原因这些类层次必须保持稳定,不允许开发人员随意修改.对此,访问者模式可以在不更改类层次结构的前提下透明的为各个类动态添加新的功能.二.访问 ...
- Java设计模式-访问者模式(Visitor)
访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化.访问者模式适用于数据结构相对稳定算法又易变化的系统.因为访问者模式使得算法操作增加变得容易.若系统数据结构对象易于变化,经 ...
随机推荐
- Be Better:遇见更好的自己-2016年记
其实并不能找到好的词语来形容过去的一年,感觉就如此平淡的过了!没有了毕业的稚气,看事情淡了,少了一丝浮躁,多了一分认真.2016也许就是那句话-多读书,多看报,少吃零食多睡觉,而我更愿意说--Be B ...
- GreenDao 数据库:使用Raw文件夹下的数据库文件以及数据库升级
一.使用Raw文件夹下的数据库文件 在使用GreenDao框架时,数据库和数据表都是根据生成的框架代码来自动创建的,从生成的DaoMaster中的OpenHelper类可以看出: public sta ...
- MVC Core 网站开发(Ninesky) 2.1、栏目的前台显示
上次创建了栏目模型,这次主要做栏目的前台显示.涉及到数据存储层.业务逻辑层和Web层.用到了迁移,更新数据库和注入的一些内容. 一.添加数据存储层 1.添加Ninesky.DataLibrary(与上 ...
- 学习C的笔记
[unsigned] 16位系统中一个int能存储的数据的范围为-32768~32767,而unsigned能存储的数据范围则是0~65535.由于在计算机中,整数是以补码形式存放的.根据最高位的不同 ...
- maven的pom.xml关系依赖书写顺序
今天遇到了一个情况,以前代码编译没有问题,升级了hbase客户端phoenix驱动,又调整了thrift的关系依赖的位置,放到了这个驱动后面. 如下: 导致了一个thrift接口类编译报错: 检查这个 ...
- java中的内部类总结
内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类 如同一个人是由大脑.肢体.器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为(血液.跳动) 显然, ...
- 【一起学OpenFOAM】03 OpenFOAM基本使用流程
OpenFOAM初学者常常对于软件的使用流程感到很迷惑,与其他的具有GUI的CFD软件不同,OpenFOAM的所有操作均为基于文本操作,譬如说里面各种计算模型.计算参数.流程控制参数等,均为通过修改对 ...
- ELK分析IIS日志
LogStash.conf input { file { type => "iis_log" path => ["C:/inetpub/logs/LogF ...
- SEO:权重如何做到从0到1
SEO:权重如何做到从0到1 [写于2016年9月]我真的好久好久没到我的博客上去看过了,今天突然登上 seo.chinaz.com,搜索 dkplus.iteye.com,发现自己的博客在百度收录中 ...
- Performance Tuning
本文译自Wikipedia的Performance tuning词条,原词条中的不少链接和扩展内容非常值得一读,翻译过程中暴露了个人工程学思想和英语水平的不足,翻译后的内容也失去很多准确性和丰富性,需 ...