• C#设计模式:访问者模式(Vistor Pattern)


    一,访问者模式是用来封装一些施加于某种数据结构之上的操作。它使得可以在不改变元素本身的前提下增加作用于这些元素的新操作,访问者模式的目的是把操作从数据结构中分离出来。

    二,代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace _21.访问者模式
    {
        /// <summary>
        /// 1 集合的访问和访问者模式Visitor Pattern
        /// 2 倾斜的可扩展性设计
        /// 3 具体场景是——我遍历每个元素对象,然后调用每个元素对象的Introduce方法来打印该元素对象的信息,
        /// 4 GetBehavior是完成特定的行为
        /// 5 GetBehaviorVisitor完成自定义的行为
        /// </summary>
        class Program
        {
            /// <summary>
            /// 访问者模式是用来封装一些施加于某种数据结构之上的操作。它使得可以在不改变元素本身的前提下增加作用于这些元素的新操作,访问者模式的目的是把操作从数据结构中分离出来。
            /// </summary>
            /// <param name="args"></param>
            static void Main(string[] args)
            {
                try
                {
                    Console.WriteLine("访问者模式Visitor");
                    List<People> peopleList = new List<People>()
                    {
                        new USA()
                        {
                            Id=638,
                            Name="ttt"
                        },
                        new Chinese()
                        {
                            Id=123,
                            Name="ccc"
                        }
                    };
                    ///固定行为的对象遍历
                    foreach (var people in peopleList)
                    {
                        Console.WriteLine("*************************");
                        people.Introduce();
                        people.GetBehavior();
    
                    }
    
                    {
                        ///特定行为的对象遍历
                        VisitorSayBehavior visitor = new VisitorSayBehavior();
                        foreach (var people in peopleList)
                        {
                            Console.WriteLine("*************************");
                            people.Introduce();
                            people.GetBehaviorVisitor(visitor);
                        }
                    }
                    {
                        ///特定行为的对象遍历
                        VisitorEatBehavior visitor = new VisitorEatBehavior();
                        foreach (var people in peopleList)
                        {
                            Console.WriteLine("*************************");
                            people.Introduce();
                            people.GetBehaviorVisitor(visitor);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                Console.Read();
            }
        }
        /// <summary>
        /// 抽象访问者
        /// </summary>
        public interface IVisitor
        {
            void GetBehaviorChinese(Chinese peopleChinese);
            void GetBehaviorUSA(USA peopleUsa);
    
        }
        /// <summary>
        /// 行为的扩展
        /// 访问者:完成说话的行为
        /// </summary>
        public class VisitorSayBehavior : IVisitor
        {
            public void GetBehaviorChinese(Chinese peopleChinese)
            {
                Console.WriteLine("中国人,说中文!!!");
            }
    
            public void GetBehaviorUSA(USA peopleUsa)
            {
                Console.WriteLine("美国人,说英文!!!");
            }
        }
        /// <summary>
        /// 行为的扩展
        /// 访问者:完成吃饭的行为
        /// </summary>
        public class VisitorEatBehavior : IVisitor
        {
            public void GetBehaviorChinese(Chinese peopleChinese)
            {
                Console.WriteLine("中国人,吃大米饭!!!");
            }
    
            public void GetBehaviorUSA(USA peopleUsa)
            {
                Console.WriteLine("美国人,吃汉堡!!!");
            }
        }
    
        /// <summary>
        ///  抽象元素角色
        /// </summary>
        public abstract class People
        {
            public int Id { get; set; }
            public string Name { get; set; }
    
            public void Introduce()
            {
                Console.WriteLine("我是{0}!!", this.Name);
            }
    
            public abstract void GetBehavior();
    
            public abstract void GetBehaviorVisitor(IVisitor visitor);
    
        }
        public class Chinese : People
        {
            /// <summary>
            /// 不同的人有不同的行为属性
            /// </summary>
            public override void GetBehavior()
            {
                ////如果没有使用重载这里可能会使用过多if else
                //if()
                //{}
                //else if()
                //{}
                //else{}
                Console.WriteLine("中国人,使用筷子");
            }
    
            //再建立多个方法  每个方法对应一种方式
            //再建立一堆的子类  分别去完成
            public override void GetBehaviorVisitor(IVisitor visitor)
            {
                visitor.GetBehaviorChinese(this);//this 是当前的实例
            }
        }
        public class USA : People
        {
            public string CourseFree { get; set; }
            public string CourseVip { get; set; }
    
            public override void GetBehavior()
            {
                //if()
                //{}
                //else if()
                //{}
                //else{}
                Console.WriteLine("美国人,使用刀叉");
            }
    
            public override void GetBehaviorVisitor(IVisitor visitor)
            {
                visitor.GetBehaviorUSA(this);//this 是当前的实例
            }
        }
    }

    三,以上代码完成了结构之上的操作,并且完成数据的自定义方式的扩展

  • 相关阅读:
    深入理解 Spring 事务原理
    spring+springMVC,声明式事务失效,原因以及解决办法
    spring 中常用的两种事务配置方式以及事务的传播性、隔离级别
    【Spring aop】Spring aop的XML和注解的两种配置实现
    Java消息队列--ActiveMq 实战
    【Android】Android开发实现进度条效果,SeekBar的简单使用。音量,音乐播放进度,视频播放进度等
    【Android】Android开发实现带有反弹效果,仿IOS反弹scrollview详解教程
    【Android】安卓开发之activity如何传值到fragment,activity与fragment传值
    【Android】Android开发初学者实现拨打电话的功能,拨打电话app小demo实现
    【Android】SlidingTabLayout实现标题栏,教你制作title标题 简单易学。
  • 原文地址:https://www.cnblogs.com/May-day/p/11642419.html
Copyright © 2020-2023  润新知