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

二,代码

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=,
Name="ttt"
},
new Chinese()
{
Id=,
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 是当前的实例
}
}
}

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

最新文章

  1. ActiveMQ与spring集成实现Queue模式
  2. vue.js 的学习
  3. 好用的 diskpart 命令,操作磁盘分区,并创建 EFI 引导分区
  4. 最简单的C/S程序——让服务器来做加法
  5. JDBC第二次学习
  6. free 和 fclose
  7. hdu4405:概率dp
  8. 使用C#对MongoDB中的数据进行查询,改动等操作
  9. linux学习(一)认识、安装Linux
  10. Nginx 配置参数详解
  11. FPN 学习笔记
  12. 通过Headless模式执行selenium脚本
  13. python- do_excel
  14. ssh登陆并执行命令不退出
  15. (转)Linux I/O 调度方法
  16. IOS-网络(文件压缩和解压缩)
  17. 04 Python入门学习-流程控制(if else elif while for)
  18. Python 循环删除指定文件夹下所有的.longtian类型文件
  19. 博弈--ZOJ 3084 S-Nim(SG)
  20. PHP 中使用explode()函数切割字符串为数组

热门文章

  1. Codeforces 962D Merge Equals ( 模拟 )
  2. JedisCluster和springboot整合
  3. Springboot(八):emoji表情保存到mysql出错的解决办法
  4. 使用私有仓库(Docker Registry 2.0)管理镜像
  5. leetcode-mid-backtracking -78 Subsets
  6. 安装Mantis出现的一些问题解决
  7. Vue中的model
  8. 测开之路一百二十八:flask之重定向和404
  9. ARTS-2
  10. JavaScript对象之--- RegExp