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

二,代码

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 是当前的实例
}
}
}

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

C#设计模式:访问者模式(Vistor Pattern)的更多相关文章

  1. 22.访问者模式(Vistor Pattern)

    using System; using System.Collections; namespace ConsoleApplication5 { /// <summary> /// 访问者模 ...

  2. C#设计模式——访问者模式(Visitor Pattern)

    一.概述由于需求的改变,某些类常常需要增加新的功能,但由于种种原因这些类层次必须保持稳定,不允许开发人员随意修改.对此,访问者模式可以在不更改类层次结构的前提下透明的为各个类动态添加新的功能.二.访问 ...

  3. 深入浅出设计模式——访问者模式(Visitor Pattern)

    模式动机 对于系统中的某些对象,它们存储在同一个集合中,且具有不同的类型,而且对于该集合中的对象,可以接受一类称为访问者的对象来访问,而且不同的访问者其访问方式有所不同,访问者模式为解决这类问题而诞生 ...

  4. 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)

    原文:乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) 作者:webabc ...

  5. Java 设计模式系列(二三)访问者模式(Vistor)

    Java 设计模式系列(二三)访问者模式(Vistor) 访问者模式是对象的行为模式.访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以 ...

  6. 二十四种设计模式:访问者模式(Visitor Pattern)

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

  7. 访问者模式(Visitor Pattern)——操作复杂对象结构

    模式概述 在软件开发中,可能会遇到操作复杂对象结构的场景,在该对象结构中存储了多个不同类型的对象信息,而且对同一对象结构中的元素的操作方式并不唯一,可能需要提供多种不同的处理方式,还有可能增加新的处理 ...

  8. .NET设计模式访问者模式

    一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...

  9. [设计模式] 23 访问者模式 visitor Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对访问者模式是这样说的:表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作.访问 ...

  10. 24种设计模式--访问者模式【Visitor Pattern】

    今天天气不错,绝对是晴空万里,骄阳似火呀,好,我们今天来讲访问者模式,我们在前面讲了组合模式和迭代器模式,通过组合模式我们能够把一个公司的人员组织机构树搭建起来,给管理带来非常大的便利,通过迭代器模式 ...

随机推荐

  1. PID221 / 烦人的幻灯片☆ x

    超详细解释!我都被我自己惊呆了! (这个题目意思我缓冲了很久!一定要读懂题!否则做不出来) 题目不懂就多读呀~ 提交你的代码 查看讨论和题解 题目描述 李教授于今天下午做一个非常重要的演讲.不幸的是他 ...

  2. cpp 面向对象初步探索

    需求 尝试定义一个complex(复数类) 简略实现 headers/complex.h #ifndef __COMPLEX__ #define __COMPLEX__ class complex { ...

  3. Springboot入门:

    Springboot入门: 1.springboot是基于spring的全新框架,设计目的:简化spring应用配置和开发过程. 该框架遵循“约定大于配置”原则,采用特定的方式进行配置,从而事开发者无 ...

  4. 通过jedis连接redis单机成功,使用redis客户端可以连接集群,但使用JedisCluster连接redis集群一直报Could not get a resource from the pool

    一,问题描述: (如题目)通过jedis连接redis单机成功,使用JedisCluster连接redis集群一直报Could not get a resource from the pool 但是使 ...

  5. 《Effective Java》读书笔记 - 10.并发

    Chapter 10 Concurrency Item 66: Synchronize access to shared mutable data synchronized这个关键字不仅保证了同步,还 ...

  6. Vue/Element-ui 安装搭建开发环境(一)

    Element 是饿了么全段开发团队推出的一套基于 vue.js2.0 的 PC Web 端开发框架. Element 中文文档:https://element.eleme.cn/#/zh-CN 1. ...

  7. Spring Security 报There is no PasswordEncoder mapped for the id "null"

    查了下发现是spring security 版本在5.0后就要加个PasswordEncoder了 解决办法 在securityConfig类下加入NoOpPasswordEncoder,不过官方已经 ...

  8. jprofiler监控wls&was配置

    jprofiler简介: jprofiler的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图.所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象. ...

  9. 方法一破解:Excel工作表保护密码

    在excel2016中实测验证过有效 在Excel中,为了保护自已的工作表不被修改,我们可以添加保护密码. 操作步骤: 1.把Excel文件的扩展名xlsx修改为Rar.瞬间Excel文件变成了压缩包 ...

  10. symbol,iterator,generator

    1.symbol是在ES6中引入的一种基本数据类型,因为symbol是不重复.唯一的数据特性,symbol设计是被用来表示对象内部的私有属性的.     symbol.for与symbol.keyfo ...