.NET设计模式访问者模式

一.访问者模式的定义:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。二.访问者模式的结构和角色:1.Visitor抽象访问者角色,为该

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

一.访问者模式的定义:

表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。

二.访问者模式的结构和角色:

 

.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", 10);  
        MedicineB b = new MedicineB("药B", 20);  
  
        //药单  
        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

.NET设计模式访问者模式

 

.NET设计模式访问者模式

四.访问者模式优缺点:

优点:
1、使得新增新的访问操作变得更加简单。
2、能够使得用户在不修改现有类的层次结构下,定义该类层次结构的操作。
3、将有关元素对象的访问行为集中到一个访问者对象中,而不是分散搞一个个的元素类中。
缺点:
1、增加新的元素类很困难。在访问者模式中,每增加一个新的元素类都意味着要在抽象访问者角色中增加一个新的抽象操作,并在每一个具体访问者类中增加相应的具体操作,违背了“开闭原则”的要求。
2、破坏封装。当采用访问者模式的时候,就会打破组合类的封装。
3、比较难理解

五.使用场景:

1、对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。
2、需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作“污染”这些对象的类,也不希望在增加新操作时修改这些类。

http://www.cnblogs.com/roucheng/p/3521864.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/120537.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Java设计模式之结构型:适配器模式

    Java设计模式之结构型:适配器模式

  • 前端开发中常用的几种设计模式有哪些_设计模式原理

    前端开发中常用的几种设计模式有哪些_设计模式原理设计模式是对软件设计开发过程中反复出现的某类问题的通用解决方案。设计模式更多的是指导思想和方法论,而不是现成的代码,当然每种设计模式都有每种语言中的具体实现方式。学习设计模式更多的是理解各种模式的内在思想和解决的问题,毕竟这是前人无数经验总结成的最佳实践,而代码实现则是对加深理解的辅助。设计模式可以分为三大类:结构型模式(StructuralPatterns):通过识别系统中组件间的简单关系来简化系统的设计。 创建型模式(CreationalPatterns):处理对象的创..

    2022年10月25日
  • 十一、代理模式 —专注,做最好的自己!#和设计模式一起旅行#[通俗易懂]

    专注,把更多的时间放到提示自己核心竞争能力上面来!其他的事情交给别人去做吧。故事背景我和设计模式MM开的奶茶店火了,一个是设计模式MM长的好看,波涛汹涌,还有一个是我们的饮品的确好喝,并且还特别在乎用户的体验,上一篇的模板方法模式中,我们最后的例子就询问顾客是否要加入调味料,而不是强制加入。俗话说,人怕出名,猪怕壮!出名后好多的媒体想让我参加他们的节目说一下我这个创业的…

  • [设计模式]委派模式「建议收藏」

    github地址:https://github.com/1711680493点我进入github如需了解更多设计模式,请进入我的设计模式专栏委派模式委派模式不是23设计模式中的一种.与策略模式很相似.拥有以下三种角色抽象任务角色 委派者角色 具体任务角色委派模式,就是将任务发给委派者角色,委派者角色去委派具体任务角色委派模式对外隐藏了具体实现,仅将委派者角色暴露给外部委派模式和策略模式不同的是,委派者角色和具体任务角色都要继承/实现抽象任务角色Spring框架很

  • visitor设计模式ppt_常用的设计模式

    visitor设计模式ppt_常用的设计模式动机Visitor是访问者的意思。数据结构中保存着元素。一般我们需要对元素进行处理,那么处理元素的代码放在哪里呢?最显然的方法就是放在数据结构的类中,在类中添加处理的方法。但是如果有很多处理,就比较麻烦了,每当增加一种处理,我们就不得不去修改表示数据结构的类。visitor模式就是用来解决这个问题的,visitor模式将数据结构的定义和处理分离开。也就是会新增一个访问者的类,将数据元素的处理交给访问者类,这样以后要新增处理的时候,只需要新增访问者就可以了。模式定义将更新(变更)封装到一个类中(访问

  • 设计模式之六大设计原则[通俗易懂]

    设计模式之六大设计原则

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号