行为型模式之访问者模式

概述

访问者模式是一种较为复杂的行为型设计模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作。例如处方单中的各种药品信息就是被访问的元素,而划价人员和药房工作人员就是访问者。访问者模式使得用户可以在不修改现有系统的情况下扩展系统的功能,为这些不同类型的元素增加新的操作。

在使用访问者模式时,被访问元素通常不是单独存在的,它们存储在一个集合中,这个集合被称为“对象结构”,访问者通过遍历对象结构实现对其中存储的元素的逐个操作。

定义

访问者模式(Visitor Pattern):提供一个作用于某对象结构中的各元素的操作表示,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式是一种对象行为型模式

实现

访问者

    public abstract class Visitor
    {
        public String Name { get; set; }

        public abstract void Visit(MedicineA a);

        public abstract void Visit(MedicineB b);
    }
    public class Charger : Visitor
    {
        public override void Visit(MedicineA a)
        {
            Console.WriteLine("划价员:" + Name + "给药" + a.Name + "划价:" + a.Price);
        }

        public override void Visit(MedicineB b)
        {
            Console.WriteLine("划价员:" + Name + "给药" + b.Name + "划价:" + b.Price);
        }
    }
    public class WorkerOfPharmacy : Visitor
    {
        public override void Visit(MedicineA a)
        {
            Console.WriteLine("药房工作者:" + Name + "拿药 :" + a.Name);
        }

        public override void Visit(MedicineB b)
        {
            Console.WriteLine("药房工作者:" + Name + "拿药 :" + b.Name);
        }
    }

药品类

    public abstract class Medicine
    {
        public String Name { get; set; }
        public double Price { get; set; }

        public Medicine(String name, double price)
        {
            this.Name = name;
            this.Price = price;
        }

        public abstract void Accept(Visitor visitor);
    }
    public class MedicineA : Medicine
    {
        public MedicineA(String name, double price) : base(name, price)
        {
        }

        public override void Accept(Visitor visitor)
        {
            visitor.Visit(this);
        }
    }
    public class MedicineB : Medicine
    {
        public MedicineB(String name, double price) : base(name, price)
        {
        }

        public override void Accept(Visitor visitor)
        {
            visitor.Visit(this);
        }
    }

药单类

    public class Presciption
    {
        List<Medicine> list = new List<Medicine>();
        public void Accept(Visitor visitor)
        {
            list.ForEach(p =>
            {
                p.Accept(visitor);
            });
        }

        public void AddMedicine(Medicine medicine)
        {
            list.Add(medicine);
        }

        public void RemoveMedicien(Medicine medicine)
        {
            list.Remove(medicine);
        }
    }

客户端

    public class Presciption
    {
        List<Medicine> list = new List<Medicine>();
        public void Accept(Visitor visitor)
        {
            list.ForEach(p =>
            {
                p.Accept(visitor);
            });
        }

        public void AddMedicine(Medicine medicine)
        {
            list.Add(medicine);
        }

        public void RemoveMedicien(Medicine medicine)
        {
            list.Remove(medicine);
        }
    }

结果

总结

主要优点

1、增加新的访问操作很方便。使用访问者模式,增加新的访问操作就意味着增加一个新的具体访问者类,实现简单,无须修改源代码,符合“开闭原则”。

2、 将有关元素对象的访问行为集中到一个访问者对象中,而不是分散在一个个的元素类中。类的职责更加清晰,有利于对象结构中元素对象的复用,相同的对象结构可以供多个不同的访问者访问。

3、 让用户能够在不修改现有元素类层次结构的情况下,定义作用于该层次结构的操作。

主要缺点

1、增加新的元素类很困难。在访问者模式中,每增加一个新的元素类都意味着要在抽象访问者角色中增加一个新的抽象操作,并在每一个具体访问者类中增加相应的具体操作,这违背了“开闭原则”的要求。

2、 破坏封装。访问者模式要求访问者对象访问并调用每一个元素对象的操作,这意味着元素对象有时候必须暴露一些自己的内部操作和内部状态,否则无法供访问者访问。

适用场景

1、 一个对象结构包含多个类型的对象,希望对这些对象实施一些依赖其具体类型的操作。在访问者中针对每一种具体的类型都提供了一个访问操作,不同类型的对象可以有不同的访问操作。

2、 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作“污染”这些对象的类,也不希望在增加新操作时修改这些类。访问者模式使得我们可以将相关的访问操作集中起来定义在访问者类中,对象结构可以被多个不同的访问者类所使用,将对象本身与对象的访问操作分离。

3、 对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。

时间: 2024-10-29 10:45:43

行为型模式之访问者模式的相关文章

(24):(行为型模式) Visitor 访问者模式

[所有分类] (24):(行为型模式) Visitor 访问者模式

23行为型模式之访问者模式

概念 Visitor模式也叫访问者模式,是行为模式之一,它分离对象的数据和行为,使用Visitor模式,可以不修改已有类的情况下,增加新的操作角色和职责. 角色和职责 抽象访问者(Visitor)角色:声明了一个或者多个访问操作,形成所有的具体元素角色必须实现的接口. 具体访问者(ConcreteVisitor)角色:实现抽象访问者角色所声明的接口,也就是抽象访问者所声明的各个访问操作. 抽象节点(Element)角色:声明一个接受操作,接受一个访问者对象作为一个参量. 具体节点(Concret

行为型设计模式之访问者模式

结构 意图 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 适用性 一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作. 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作“污染”这些对象的类.Vi s i t o r 使得你可以将相关的操作集中起来定义在一个类中.当该对象结构被很多应用共享时,用Vi s i t o r 模式让每个应用仅包含需要用到的操作. 定义对象结

10 行为型模式之 - 访问者模式

访问者模式介绍:访问者模式是一种将数据操作与数据结构分离的设计模式,它是<设计模式>中23种设计模式中最复杂的一个,但是它的使用频率并不高,正如<设计模式>的作者GOF对访问者模式的描述:大多数情况下,你并不需要使用访问者模式,但是当你一旦需要使用它时,那你就是真地需要它了. 访问者模式的基本想法是,软件系统中拥有一个由许多对象构成的,比较稳定的对象结构,这些对象的类都拥有一个accept方法,用来接受访问者对象的访问.访问者是一个接口,它拥有一个visit方法,从而使访问者得以处

Java设计模式(23)——行为模式之访问者模式

一.概述 概念 作用于某个对象群中各个对象的操作.它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作. 引入 试想这样一个场景,在一个Collection中放入了一大堆的各种对象的引用,取出时却需要根据这些对象的不同具体类型执行不同操作,那我们有如下方案: public void show(Collection c) { Iterator it = c.iterator(); while (it.hasNext()) { Object o = it.next(); if (o i

java设计模式9.备忘录模式、访问者模式、调停者模式

备忘录模式 备忘录模式又叫快照模式,备忘录对象是一个用来存储另外一个对象内部状态快照的对象.备忘录的用意是在不破坏封装的条件下,将一个对象的状态捕捉,并外部化存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态,备忘录模式常与命令模式和迭代子模式一起使用. 访问者模式 访问者的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变.访问者模式使适用于数据结构相对未定的系统,它把数据结构和作用于结构之上的操作解耦. 抽象访问者角色

GoF23种设计模式之行为型模式之访问者模式

概述 表示一个作用于某对象结构中的各元素的操作. 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 适用性 1.一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作. 2.需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作"污染"这些对象的类. Visitor使得你可以将相关的操作集中起来定义在一个类中. 当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作. 3.定义对象结构

设计模式(十七)访问者模式(Visitor)-行为型

访问者模式Visitor 访问者模式(Visitor Pattern)是GoF提出的23种设计模式中的一种,属于行为模式.据<大话设计模式>中说算是最复杂也是最难以理解的一种模式了. 定义(源于GoF<Design Pattern>):表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 从定义可以看出结构对象是使用访问者模式必备条件,而且这个结构对象必须存在遍历自身各个对象的方法.这便类似于Java语言当中的collection

设计模式解密(22)- 访问者模式

前言:访问者模式拆分  访问者模式基础篇 :http://www.cnblogs.com/JsonShare/p/7380772.html  访问者模式扩展篇 - 分派的概念: http://www.cnblogs.com/JsonShare/p/7381705.html 1.简介  定义:表示一个作用于其对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 主要解决:稳定的数据结构和易变的操作耦合问题.就是把数据结构和作用于结构上的操作解耦合,使得操作集合可