设计模式-》访问者模式

例子 访问者模式

  • Element -> AbsPlatform -》 User,Guild,GuildMember
  • Visitor -> AbsVisitor -》 教会管理员,教会创建者,平台管理员
  • ObjectStructure -> BusinessReport
public abstract class AbsPlatform { /// <summary> /// visitor 获取数据 /// </summary> /// <param name="absVisitor"></param> /// <returns></returns> public abstract string Accept(AbsVisitor absVisitor); } public class UserPlatform : AbsPlatform { public User _user; public UserPlatform(User user) { _user = user; } public override string Accept(AbsVisitor absVisitor) { return absVisitor.Visit(this); } } public class GuildPlatform : AbsPlatform { public Domain.Guild _guild; public GuildPlatform(Domain.Guild guild) { _guild = guild; } public override string Accept(AbsVisitor absVisitor) { return absVisitor.Visit(this); } } public class GuildMemberPlatform : AbsPlatform { public GuildMember _guildMember; public GuildMemberPlatform(GuildMember guildMember) { _guildMember = guildMember; } public override string Accept(AbsVisitor absVisitor) { return absVisitor.Visit(this); } } public abstract class AbsVisitor { /// <summary> /// 获取数据 /// </summary> /// <param name="engineer"></param> /// <returns></returns> public abstract string Visit(UserPlatform engineer); public abstract string Visit(GuildPlatform manager); public abstract string Visit(GuildMemberPlatform guildMemberPlatform); } public class PlatformAdminVisitor : AbsVisitor { public override string Visit(UserPlatform engineer) { string registerSource = engineer._user.RegisterType == RegisterType.App ? "APP" : "H5"; return ( $"目前是平台管理员,{engineer._user.Name}加入{engineer._user.JoinGuildCount}个教会,注册来源为{registerSource}"); } public override string Visit(GuildPlatform manager) { return ($"目前是平台管理员,教会名:{manager._guild.Name},教会人数:{manager._guild.GuildMemberCount}"); } public override string Visit(GuildMemberPlatform guildMemberPlatform) { return ( $"目前是平台管理员,教会成员名:{guildMemberPlatform._guildMember.Name},教会成员加入时间{guildMemberPlatform._guildMember.CreateTime.ToString("yyyy-M-d dddd")}"); } } public class GuildAdminVisitor : AbsVisitor { public override string Visit(UserPlatform engineer) { return $"目前是教会管理员,没有权限查看用户信息"; } public override string Visit(GuildPlatform manager) { return ($"目前是教会管理员,教会名:{manager._guild.Name}"); } public override string Visit(GuildMemberPlatform guildMemberPlatform) { return ($"目前是教会管理员,教会成员名:{guildMemberPlatform._guildMember.Name}"); } } public class GuildOwnerVisitor : AbsVisitor { public override string Visit(UserPlatform engineer) { return ($"目前是教会创始人,没有权限查看用户信息"); } public override string Visit(GuildPlatform manager) { return($"目前是教会创始人,教会名:{manager._guild.Name},教会人数:{manager._guild.GuildMemberCount}"); } public override string Visit(GuildMemberPlatform guildMemberPlatform) { return( $"目前是教会创始人,教会成员名:{guildMemberPlatform._guildMember.Name},教会成员加入时间{guildMemberPlatform._guildMember.CreateTime.ToString("yyyy-M-d dddd")}"); } } public class BusinessReport { private List<AbsPlatform> _absPlatforms; public BusinessReport(List<AbsPlatform> absPlatforms) { _absPlatforms = absPlatforms; } public void ShowReport(AbsVisitor visitor) { foreach (var platform in _absPlatforms) { Console.WriteLine(platform.Accept(visitor)); } } } static void Main(string[] args) { var Users = ObjectBuilder.BuilderUsers(50).Select(x => { return new UserPlatform(x); }).Cast<AbsPlatform>() .ToList(); var Guilds = ObjectBuilder.BuilderGuilds(50).Select(x => { return new GuildPlatform(x); }) .Cast<AbsPlatform>().ToList(); var GuildMembers = ObjectBuilder.BuilderGuildMembers(50).Select(x => { return new GuildMemberPlatform(x); }) .Cast<AbsPlatform>() .ToList(); var report = new BusinessReport(Users.Concat(Guilds).Concat(GuildMembers).ToList()); // report.ShowReport(new PlatformAdminVisitor()); // report.ShowReport(new GuildAdminVisitor()); report.ShowReport(new GuildOwnerVisitor()); Console.WriteLine("Hello World!"); }

个人总结

  • Element数据源
  • Visitor不同的查询方式
  • ObjectStructure 程序运行的上下文

参考地址


__EOF__

本文作者icxldd
本文链接https://www.cnblogs.com/icxldd/p/15804950.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   icxl  阅读(76)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示