访问者模式

来源:互联网 发布:java上传txt文件 编辑:程序博客网 时间:2024/06/06 16:28

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

例如:男人,女人,操作/访问者为 失败,成功

如果人类性别不止男女,还有中性,那么访问者模式将不适合,因为增加一个性别,将会设计好多类的改动,不符开放-封闭原则。

访问者模式适合数据结构相对稳定的系统。

它把数据结构和作用于数据结构上的操作之间耦合解开,使得操作集合可以相对自由独立地演化。

优点:增加新的操作比较方便。即增加一个新的访问者即可。

缺点:增加新的数据结构变得困难。

 

 

    class Program    {        static void Main(string[] args)        {            ObjectStructure o = new ObjectStructure();            o.Attach(new Man());            o.Attach(new Woman());            Success v1 = new Success();            o.Display(v1);            Failing v2 = new Failing();            o.Display(v2);            Amativeness v3 = new Amativeness();            o.Display(v3);            Marriage v4 = new Marriage();            o.Display(v4);            Console.Read();        }    }    //状态    abstract class Action    {        //得到男人结论或反应        public abstract void GetManConclusion(Man concreteElementA);        //得到女人结论或反应        public abstract void GetWomanConclusion(Woman concreteElementB);    }    //成功    class Success : Action    {        public override void GetManConclusion(Man concreteElementA)        {            Console.WriteLine("{0}{1}时,背后多半有一个伟大的女人。", concreteElementA.GetType().Name, this.GetType().Name);        }        public override void GetWomanConclusion(Woman concreteElementB)        {            Console.WriteLine("{0}{1}时,背后大多有一个不成功的男人。", concreteElementB.GetType().Name, this.GetType().Name);        }    }    //失败    class Failing : Action    {        public override void GetManConclusion(Man concreteElementA)        {            Console.WriteLine("{0}{1}时,闷头喝酒,谁也不用劝。", concreteElementA.GetType().Name, this.GetType().Name);        }        public override void GetWomanConclusion(Woman concreteElementB)        {            Console.WriteLine("{0}{1}时,眼泪汪汪,谁也劝不了。", concreteElementB.GetType().Name, this.GetType().Name);        }    }    //恋爱    class Amativeness : Action    {        public override void GetManConclusion(Man concreteElementA)        {            Console.WriteLine("{0}{1}时,凡事不懂也要装懂。", concreteElementA.GetType().Name, this.GetType().Name);        }        public override void GetWomanConclusion(Woman concreteElementB)        {            Console.WriteLine("{0}{1}时,遇事懂也装作不懂", concreteElementB.GetType().Name, this.GetType().Name);        }    }    //结婚    class Marriage : Action    {        public override void GetManConclusion(Man concreteElementA)        {            Console.WriteLine("{0}{1}时,感慨道:恋爱游戏终结时,‘有妻徒刑’遥无期。", concreteElementA.GetType().Name, this.GetType().Name);        }        public override void GetWomanConclusion(Woman concreteElementB)        {            Console.WriteLine("{0}{1}时,欣慰曰:爱情长跑路漫漫,婚姻保险保平安。", concreteElementB.GetType().Name, this.GetType().Name);        }    }    //人    abstract class Person    {        //接受        public abstract void Accept(Action visitor);    }    //男人    class Man : Person    {        public override void Accept(Action visitor)        {            visitor.GetManConclusion(this);        }    }    //女人    class Woman : Person    {        public override void Accept(Action visitor)        {            visitor.GetWomanConclusion(this);        }    }    //对象结构    class ObjectStructure    {        private IList<Person> elements = new List<Person>();        //增加        public void Attach(Person element)        {            elements.Add(element);        }        //移除        public void Detach(Person element)        {            elements.Remove(element);        }        //查看显示        public void Display(Action visitor)        {            foreach (Person e in elements)            {                e.Accept(visitor);            }        }    }


 

 

基本模型:

 

    class Program    {        static void Main(string[] args)        {            ObjectStructure o = new ObjectStructure();            o.Attach(new ConcreteElementA());            o.Attach(new ConcreteElementB());            ConcreteVisitor1 v1 = new ConcreteVisitor1();            ConcreteVisitor2 v2 = new ConcreteVisitor2();            o.Accept(v1);            o.Accept(v2);            Console.Read();        }    }    abstract class Visitor    {        public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA);        public abstract void VisitConcreteElementB(ConcreteElementB concreteElementB);    }    class ConcreteVisitor1 : Visitor    {        public override void VisitConcreteElementA(ConcreteElementA concreteElementA)        {            Console.WriteLine("{0}被{1}访问", concreteElementA.GetType().Name, this.GetType().Name);        }        public override void VisitConcreteElementB(ConcreteElementB concreteElementB)        {            Console.WriteLine("{0}被{1}访问", concreteElementB.GetType().Name, this.GetType().Name);        }    }    class ConcreteVisitor2 : Visitor    {        public override void VisitConcreteElementA(ConcreteElementA concreteElementA)        {            Console.WriteLine("{0}被{1}访问", concreteElementA.GetType().Name, this.GetType().Name);        }        public override void VisitConcreteElementB(ConcreteElementB concreteElementB)        {            Console.WriteLine("{0}被{1}访问", concreteElementB.GetType().Name, this.GetType().Name);        }    }    abstract class Element    {        public abstract void Accept(Visitor visitor);    }    class ConcreteElementA : Element    {        public override void Accept(Visitor visitor)        {            visitor.VisitConcreteElementA(this);        }        public void OperationA()        { }    }    class ConcreteElementB : Element    {        public override void Accept(Visitor visitor)        {            visitor.VisitConcreteElementB(this);        }        public void OperationB()        { }    }    class ObjectStructure    {        private IList<Element> elements = new List<Element>();        public void Attach(Element element)        {            elements.Add(element);        }        public void Detach(Element element)        {            elements.Remove(element);        }        public void Accept(Visitor visitor)        {            foreach (Element e in elements)            {                e.Accept(visitor);            }        }    }


 

0 0
原创粉丝点击