zoukankan      html  css  js  c++  java
  • 设计模式之—访问者模式<VisitorPattern>

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

                   适用于数据结构相对稳定的系统,如下示例的男人和女人。男人和女人是固定的

    示例的UML图如下:

    状态抽象类(Action)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace VisitorPattern.CLASS
    {
        //状态类
        abstract class Action
        {
            public abstract void GetManReflect(Man man); //获取男人的反映
            public abstract void GetWomanReflect(Woman woman); //获取女人的反映
        }
    
    }
    View Code

    成功状态(Success)继承于状态抽象类(Action)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace VisitorPattern.CLASS
    {
        //成功状态
        class Success : Action
        {
            public override void GetManReflect(Man man)
            {
                Console.WriteLine("{0},{1}时,背后多半有个伟大的女人。",man.GetType().Name,this.GetType().Name);
            }
    
            public override void GetWomanReflect(Woman woman)
            {
                Console.WriteLine("{0},{1}时,背后大多有一个不成功的男人。", woman.GetType().Name, this.GetType().Name);
            }
        }
    }
    View Code

    失败状态(Failing)继承于状态抽象类(Action)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace VisitorPattern.CLASS
    {
        class Failing :Action
        {
            public override void GetManReflect(Man man)
            {
                Console.WriteLine("{0},{1}时,闷头喝酒,谁也不用劝。", man.GetType().Name, this.GetType().Name);
            }
    
            public override void GetWomanReflect(Woman woman)
            {
                Console.WriteLine("{0},{1}时,眼泪汪汪,谁也劝不了", woman.GetType().Name, this.GetType().Name);
            }
        }
    }
    View Code

    人类(Person)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace VisitorPattern.CLASS
    {
        abstract class Person
        {
            protected string action;
            public string Action
            {
                get { return action; }
                set { action = value; }
            }
            /// <summary>
            /// 得出结论
            /// </summary>
            public abstract void GetConclusion(Action action); 
        }
    }
    View Code

    男人类(Man)继承于人类(Person)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace VisitorPattern.CLASS
    {
        class Man:Person
        {
            public override void GetConclusion(Action action)
            {
               action.GetManReflect(this);
            }
        }
    }
    View Code

    女人类(Woman)继承于人类(Person)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace VisitorPattern.CLASS
    {
        class Woman:Person
        {
            public override void GetConclusion(Action action)
            {
                action.GetWomanReflect(this);
            }
        }
    }
    View Code

    对象结构类(ObjectStruction) 双分派技术:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace VisitorPattern.CLASS
    {
        //对象结构
        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 action)
            {
                foreach (Person person in elements)
                {
                    person.GetConclusion(action);
                }
            }
        }
    }
    View Code

    测试类(TestMain)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    using VisitorPattern.CLASS;
    namespace VisitorPattern
    {
        class TeatMain
        {
            static void Main(string[] args)
            {
                ObjectStructure obj = new ObjectStructure();
                obj.Attach(new Man());
                obj.Attach(new Woman());
    
                Success su = new Success();
                obj.Display(su);
    
                Failing fa = new Failing();
                obj.Display(fa);
    
                Console.Read();
            }
        }
    }
    View Code

    测试结果:

    要么忍,要么狠,要么滚!
  • 相关阅读:
    泛型类型转为DataTable类型
    FineUploader 学习笔记
    如何理解Python中的if __name__ == '__main__'
    什么是python 中的顶层代码?
    任务十三:零基础JavaScript编码(一)
    目前比较全的CSS重设(reset)方法总结(转)
    任务十二:学习CSS 3的新特性
    JS高级程序设计第三版——变量、作用域和内存问题
    任务十:Flexbox 布局练习
    任务九:使用HTML/CSS实现一个复杂页面
  • 原文地址:https://www.cnblogs.com/zxd543/p/3307659.html
Copyright © 2011-2022 走看看