【设计模式】——访问者模式

【访问者模式】

 

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

 

【介绍】

 

  • 主要解决:稳定的数据结构和易变的操作耦合问题

  • 何时使用:需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免这些操作影响到这些对象的类

  • 如何解决:在被访问者的类里面加一个对外提供接待访问者的接口

  • 关键代码:在数据基础类里面有一个方法接受访问者,将自身引用传入访问者

  • 优点:符合单一职责原则;优秀的扩展性;灵活性

  • 缺点:具体元素对访问者公布细节,违反了迪米特法则;具体元素变更比较困难;违反了依赖倒置原则,依赖了具体类,没有依赖抽象

  • 注意事项:访问者可以对功能进行统一

 

【实现】

 


步骤一:Element类:人类

 abstract class Person

    {

        //接受

        public abstract void Accept(Action visitor);

    }

步骤二:ConcreteCisitor类:具体人类

 

//男人

    class Man : Person

    {

        public override void Accept(Action visitor)

        {

            visitor.GetManConclusion(this);

        }

    }



    //女人

    class Woman : Person

    {

        public override void Accept(Action visitor)

        {

            visitor.GetWomanConclusion(this);

        }

    }




 

步骤三:Visitor类:状态类

abstract class Action

    {

        //得到男人结论或反应

        public abstract void GetManConclusion(Man concreteElementA);

        //得到女人结论或反应

        public abstract void GetWomanConclusion(Woman concreteElementB);

    }

 

步骤四:ConcreteCisitor类:具体状态类

 

  //成功

    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);

        }

    }


  
步骤五:ObjectStructure类:对象结构类

 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);

            }

        }

    }



步骤六:客户端代码


 

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();

        }



【总结】

 

一、访问者模式的目的是要把处理从数据结构分离出来,让系统又比较稳定的数据结构,有易于变化的算法,使得算法操作的增加变得容易

 

二、访问者模式增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者,访问者模式将有关的行为集中到一个访问者对象中

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值