设计模式笔记(二十四) —— 访问者模式

访问者模式(Visitor):表示一个作用于某对象结构中的各种元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
      访问者模式适用于数据结构相对稳定的系统。它把数据结构和作用于结构上的操作之间的耦合解脱开,便得操作集合可以相对自由地演化。访问者模式的目的是要把处理从数据结构分离出来。有比较稳定的数据结构,又易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易。
      访问者模式的优点就是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问对象中。缺点就是使增加新的数据结构变得困难了。 

  1. using System;
  2. using System.Collections.Generic;
  3. /**概述:
  4.  * 访问者模式(Visitor):表示一个作用于某对象结构中的各种元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
  5.  * 访问者模式适用于数据结构相对稳定的系统。它把数据结构和作用于结构上的操作之间的耦合解脱开,便得操作集合可以相对自由地演化。访问者模式的目的是要把处理从数据结构分离出来。有比较稳定的数据结构,又易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易。
  6.  * 访问者模式的优点就是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问对象中。缺点就是使增加新的数据结构变得困难了。
  7.  */
  8. namespace StuDesignMode.visitor
  9. {
  10.    abstract class AbsVisitor
  11.     {
  12.        public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA);
  13.        public abstract void VisitConcreteElementB(ConcreteElementB concreteElementB);
  14.     }
  15.    class ConcreteVisitor1 : AbsVisitor
  16.    {
  17.        public override void VisitConcreteElementA(ConcreteElementA concreteElementA)
  18.        {
  19.            Console.WriteLine("{0}被{1}访问",concreteElementA.GetType().Name,this.GetType().Name);
  20.        }
  21.        public override void VisitConcreteElementB(ConcreteElementB concreteElementB)
  22.        {
  23.            Console.WriteLine("{0}被{1}访问", concreteElementB.GetType().Name, this.GetType().Name);
  24.        }
  25.    }
  26.    class ConcreteVisitor2 : AbsVisitor
  27.    {
  28.        public override void VisitConcreteElementA(ConcreteElementA concreteElementA)
  29.        {
  30.            Console.WriteLine("{0}被{1}访问", concreteElementA.GetType().Name, this.GetType().Name);
  31.        }
  32.        public override void VisitConcreteElementB(ConcreteElementB concreteElementB)
  33.        {
  34.            Console.WriteLine("{0}被{1}访问", concreteElementB.GetType().Name, this.GetType().Name);
  35.        }
  36.    }
  37.    abstract class Element
  38.    {
  39.        public abstract void Accept(AbsVisitor visitor);
  40.    }
  41.    class ConcreteElementA:Element
  42.    {
  43.        public override void Accept(AbsVisitor visitor)
  44.        {
  45.            visitor.VisitConcreteElementA(this);
  46.        }
  47.    }
  48.    class ConcreteElementB:Element
  49.    {
  50.        public override void Accept(AbsVisitor visitor)
  51.        {
  52.            visitor.VisitConcreteElementB(this);
  53.        }
  54.    }
  55.    class ObjectStructure
  56.    {
  57.        private List<Element> list = new List<Element>();
  58.        public void Attach(Element element)
  59.        {
  60.            list.Add(element);
  61.        }
  62.        public void Detach(Element element)
  63.        {
  64.            list.Remove(element);
  65.        }
  66.        public void Accept(AbsVisitor visitor)
  67.        {
  68.            foreach (Element e in list)
  69.            {
  70.                e.Accept(visitor);
  71.            }
  72.        }
  73.    }
  74.    class ClientTest
  75.    {
  76.        static void Main(string[] args)
  77.        {
  78.            ObjectStructure o = new ObjectStructure();
  79.            o.Attach(new ConcreteElementA());
  80.            o.Attach(new ConcreteElementB());
  81.            ConcreteVisitor1 v1 = new ConcreteVisitor1();
  82.            ConcreteVisitor2 v2 = new ConcreteVisitor2();
  83.            o.Accept(v1);
  84.            o.Accept(v2);
  85.            Console.WriteLine();
  86.        }
  87.    }
  88. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值