[设计]访问者模式

来源:互联网 发布:此何遽不为福乎的为 编辑:程序博客网 时间:2024/06/06 11:38

[设计]访问者模式

场景

  • 雷达数据要处理的结果分为很多事,有的要转化为出时空图的数据有的要转化为出地图的数据,有的要转化为出波线图的数据以还要加其它图。
    这时数据源不变但是要经过不同的算法出来不同的数据结构

解决办法

  • 数据结构是稳定的,操作是变化的那么我就让它们都分离呗,都抽象一下。这样我们在处理数据的类中把操作以参数的形式传进去这样我们就可以来实现两者的关系也就是直接朋友的关系了。
  • 这样对我们来说操作是可变化需要更改只要维护这个操作类就可以,就不用动数据结构生成和执行的类。
    所以我们先创建两个抽象类
public  interface IVisit    {        void Visit(AElement a);        void Visit(BElement b);    }     public abstract  class ElementBase    {        public abstract void Accept(IVisit visit);        public abstract void Print();    }

-我们实现两种数据的结果也就是我们说的各种目的数据结构

 public class AElement : ElementBase    {        public override void Accept(IVisit visit)        {            visit.Visit(this);        }        public override void Print()        {            Console.WriteLine("我是A");        }    }public class BElement : ElementBase    {        public override void Accept(IVisit visit)        {            visit.Visit(this);        }        public override void Print()        {            Console.WriteLine("我是B");        }    }
  • 我们再创建一下结构对象这里采用与网上一样的随机的方式
public class ObjectStruct    {        private List<ElementBase> elements = new List<ElementBase>();        public List<ElementBase> Elements        {            get { return elements; }        }        public ObjectStruct()        {            Random rd = new Random();            for (int i = 0; i < 10; i++)            {                int num = rd.Next(10);                if (num>5)                {                    elements.Add(new AElement());                }                else                {                    elements.Add(new BElement());                }            }        }    }
  • 我们再创建具体的访问者
public class CreateVisitor : IVisit    {        public void Visit(AElement a)        {            a.Print();        }        public void Visit(BElement b)        {            b.Print();        }    }
  • 我们可以这样用
static void Main(string[] args)        {            ObjectStruct objectstrut = new ObjectStruct();            foreach (var item in objectstrut.Elements)            {                item.Accept(new CreateVisitor());            }            Console.Read();        }

类图

  • 占坑

注意

  1. 这种结构如果数据结构也经常变化的话是不是发现我们添加访问者的难度还是很大的吧
  2. 这种访问是没有限制的,我们可以访问这些类的所有的东西
  3. 好处也明显就是添加操作也就是访问者的时候特别容易
    源码
    原文地址

模式是死的,人是活的,但是模式也是可以活用的,不可能一个程序只有一种模式,模式其它就是设计原则的展开,现在有很多的模式没有写入这经典中但是也是常用的。比如DDD这样,学模式用模式而不死于模式。如果老板说实现某个功能快的话有1万块钱,我肯定怎么怎么写了哈哈哈哈

原创粉丝点击