c#设计模式之访问者模式

访问者模式(Visitor Pattern)是GoF提出的23种设计模式中的一种,属于行为模式。据《大话设计模式》中说算是最复杂也是最难以理解的一种模式了。
定义(源于GoF《Design Pattern》):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。

类图如下


IElement

 public  interface IElement
    {
        void Accept(IVisitor visitor);
    }

ConcreteElement1

 public class ConcreteElement1 : IElement
    {
        public void Accept(IVisitor visitor)
        {
            visitor.Visit(this);
        }
    }

ConcreteElement2

public class ConcreteElement2 : IElement
    {
        public void Accept(IVisitor visitor)
        {
            visitor.Visit(this);
        }
    }

IVisitor

 public interface IVisitor
    {
        void Visit(ConcreteElement1 element1);
        void Visit(ConcreteElement2 element2);
    }

ConcreteVisitorA

public class ConcreteVisitorA : IVisitor
    {
        public void Visit(ConcreteElement1 element1)
        {
            Console.WriteLine("visit ConcreteElement1 in ConcreteVisitorA");
        }

        public void Visit(ConcreteElement2 element2)
        {
            Console.WriteLine("visit ConcreteElement2 in ConcreteVisitorA");
        }
    }

ConcreteVisitorB

public class ConcreteVisitorB : IVisitor
    {
        public void Visit(ConcreteElement1 element1)
        {
            Console.WriteLine("visit ConcreteElement1 in ConcreteVisitorB");
        }

        public void Visit(ConcreteElement2 element2)
        {
            Console.WriteLine("visit ConcreteElement2 in ConcreteVisitorB");
        }
    }

ObjectStruct

public class ObjectStruct
    {
        private List<IElement> elements;
        public ObjectStruct()
        {
            elements = new List<IElement>();
        }
        public void Accept(IVisitor visitor)
        {
            foreach (var item in this.elements)
            {
                item.Accept(visitor);
            }
        }
        public void Add(IElement element)
        {
            this.elements.Add(element);
        }
        public void Remove(IElement element)
        {
            this.elements.Remove(element);
        }
    }

调用

static void Main(string[] args)
        {
            ObjectStruct objectStruct = new ObjectStruct();
            objectStruct.Add(new ConcreteElement1());
            objectStruct.Add(new ConcreteElement2());

            ConcreteVisitorA concreteVisitorA = new ConcreteVisitorA();
            objectStruct.Accept(concreteVisitorA);

            ConcreteVisitorB concreteVisitorB = new ConcreteVisitorB();
            objectStruct.Accept(concreteVisitorB);
        }

优点:

  1. 方便数据操作的扩展
  2. 将数据结构与数据的操作解耦,符合单一职责

缺点:

  1. 不利于数据结构的扩展(由于IVisitor接口需要对具体元素的依赖,增加具体元素类需要修改IVisitor接口)
  2. 破坏了类的三大要素封装性,具体元素类需要对访问者公布细节
  3. 违反依赖倒置原则, IVisitor接口以来具体元素类

源代码地址: 点击我下载 提取码: r3x8

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 中秋两天假,昨天给爸妈打了个电话,他们正好在爷爷奶奶家,顺便跟爷爷奶奶问好。今天下午抽空给外公外婆打电话了,听声音...
    走着_看着_乐着_苦着阅读 150评论 0 0
  • 敬爱的黄校长,亲爱的家人们: 大家晚上好,我是七田阳光的亓玉婷,今天(2019.3.3)是我在群内日精进第179天...
    A七田阳光婷婷老师阅读 320评论 0 0
  • 把简单的事情做好 依然是精保和卫生标准化 企业靠的是持续
    京心达张新波阅读 131评论 0 0
  • JS 自身操作部分 1、数据类型 | 变量定义 动态语言,不需要指定参数的数据类型,也就是说可以任意赋值数字 | ...
    雪妮爸爸阅读 366评论 0 0
  • 最近更新:2018-03-30 1.思维导图2.关于本书3.关于作者4.本书金句5.核心内容 前言:这是有书共读a...
    努力奋斗的durian阅读 577评论 0 0