推荐阅读:

前言

       在开发游戏过程中,当玩家合成一种道具的时候,对于不痛的道具,需要的碎片个数,类型是不同的。用传统的写法,就是使用if...else...语句来判断。如果后面,策划修改了道具合成机制,我们就需要更改if结构判断了,这就违背了设计模式原则中的对扩展的开发,对修改的关闭,为此,我们引入责任链模式。

介绍

       责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

要素

       1.抽象处理者(Handler):定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。

       2.具体处理者(ConcreteHandler):具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

       3.请求类(Request):处理者需要处理的请求信息;

实现

       这里我们还是用上面的例子,使用责任链模式来实现奖品的分发机制。

1.创建请求类

  1. //请求类,请求合成道具
  2. public class SyntheticRequest
  3. {
  4. /// 当前拥有的碎片数量
  5. public int DebrisNum{ get; set; }
  6. public SyntheticRequest(int num)
  7. {
  8. this.DebrisNum= num;
  9. }
  10. }

2.创建抽象角色类

  1. //抽象角色类,可以通过合成得到的道具
  2. public abstract class Prop
  3. {
  4. //下一级道具,更低一级的道具
  5. public Prop NextProp{ get; set; }
  6. //当前道具类型
  7. public string PropType{ get; set; }
  8. //构造函数
  9. public Prop(string type)
  10. { this.PropType= type; }
  11. /// 该角色的执行行为
  12. public abstract void Behaviour(SyntheticRequest request);
  13. }

3.创建具体角色类

  1. ///高级道具
  2. public class Prop1:Prop
  3. {
  4. public Prop1(string type) : base(type) { }
  5. public override void Behaviour(SyntheticRequest request)
  6. {
  7. if (request.DebrisNum>= 1000)
  8. {
  9. Console.WriteLine("获得{0},消耗{1}碎片", this.PropType,request.DebrisNum);
  10. }
  11. else if (NextProp != null)
  12. {
  13. Console.WriteLine("{0}个碎片不够,只能合成更低一级的道具,即{1}", request.DebrisNum, NextProp.PropType);
  14. NextProp.Behaviour(request);
  15. }
  16. }
  17. }
  18. ///中级道具
  19. public class Prop2:Prop
  20. {
  21. public Prop2(string type) : base(type) { }
  22. public override void Behaviour(SyntheticRequest request)
  23. {
  24. if (request.DebrisNum>= 500)
  25. {
  26. Console.WriteLine("获得{0},消耗{1}碎片", this.PropType,request.DebrisNum);
  27. }
  28. else if (NextProp != null)
  29. {
  30. Console.WriteLine("{0}个碎片不够,只能合成更低一级的道具,即{1}", request.DebrisNum, NextProp.PropType);
  31. NextProp.Behaviour(request);
  32. }
  33. }
  34. }
  35. ///低级道具
  36. public class Prop3:Prop
  37. {
  38. public Prop3(string type) : base(type) { }
  39. public override void Behaviour(SyntheticRequest request)
  40. {
  41. if (request.DebrisNum>= 10)
  42. {
  43. Console.WriteLine("获得{0},消耗{1}碎片", this.PropType,request.DebrisNum);
  44. }
  45. else if (NextProp != null)
  46. {
  47. Console.WriteLine("{0}个碎片不够,只能合成更低一级的道具,即{1}", request.DebrisNum, NextProp.PropType);
  48. NextProp.Behaviour(request);
  49. }
  50. }
  51. }

4.使用责任链模式

  1. //使用责任链模式
  2. class Program
  3. {
  4. static void Main(string[] args)
  5. {
  6. //申请合成道具
  7. SyntheticRequest request= new SyntheticRequest(66);
  8. //对该活动的审批可能涉及的角色
  9. Prop prop1= new Prop1("高级道具");
  10. Prop prop2= new Prop2("中级道具");
  11. Prop prop3= new Prop3("低级道具");
  12. //设置责任链
  13. prop1.NextProp = prop2;
  14. prop2.NextProp = prop3;
  15. //合成处理
  16. prop1.Behaviour(request);
  17. }
  18. }

整合代码

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace 责任链模式
  7. {
  8. //请求类,请求合成道具
  9. public class SyntheticRequest
  10. {
  11. /// 当前拥有的碎片数量
  12. public int DebrisNum{ get; set; }
  13. public SyntheticRequest(int num)
  14. {
  15. this.DebrisNum= num;
  16. }
  17. }
  18. //抽象角色类,可以通过合成得到的道具
  19. public abstract class Prop
  20. {
  21. //下一级道具,更低一级的道具
  22. public Prop NextProp{ get; set; }
  23. //当前道具类型
  24. public string PropType{ get; set; }
  25. //构造函数
  26. public Prop(string type)
  27. { this.PropType= type; }
  28. /// 该角色的执行行为
  29. public abstract void Behaviour(SyntheticRequest request);
  30. }
  31. ///高级道具
  32. public class Prop1:Prop
  33. {
  34. public Prop1(string type) : base(type) { }
  35. public override void Behaviour(SyntheticRequest request)
  36. {
  37. if (request.DebrisNum>= 1000)
  38. {
  39. Console.WriteLine("获得{0},消耗{1}碎片", this.PropType,request.DebrisNum);
  40. }
  41. else if (NextProp != null)
  42. {
  43. Console.WriteLine("{0}个碎片不够,只能合成更低一级的道具,即{1}", request.DebrisNum, NextProp.PropType);
  44. NextProp.Behaviour(request);
  45. }
  46. }
  47. }
  48. ///中级道具
  49. public class Prop2:Prop
  50. {
  51. public Prop2(string type) : base(type) { }
  52. public override void Behaviour(SyntheticRequest request)
  53. {
  54. if (request.DebrisNum>= 500)
  55. {
  56. Console.WriteLine("获得{0},消耗{1}碎片", this.PropType,request.DebrisNum);
  57. }
  58. else if (NextProp != null)
  59. {
  60. Console.WriteLine("{0}个碎片不够,只能合成更低一级的道具,即{1}", request.DebrisNum, NextProp.PropType);
  61. NextProp.Behaviour(request);
  62. }
  63. }
  64. }
  65. ///低级道具
  66. public class Prop3:Prop
  67. {
  68. public Prop3(string type) : base(type) { }
  69. public override void Behaviour(SyntheticRequest request)
  70. {
  71. if (request.DebrisNum>= 10)
  72. {
  73. Console.WriteLine("获得{0},消耗{1}碎片", this.PropType,request.DebrisNum);
  74. }
  75. else if (NextProp != null)
  76. {
  77. Console.WriteLine("{0}个碎片不够,只能合成更低一级的道具,即{1}", request.DebrisNum, NextProp.PropType);
  78. NextProp.Behaviour(request);
  79. }
  80. }
  81. }
  82. //使用责任链模式
  83. class Program
  84. {
  85. static void Main(string[] args)
  86. {
  87. //申请合成道具
  88. SyntheticRequest request= new SyntheticRequest(66);
  89. //对该活动的审批可能涉及的角色
  90. Prop prop1= new Prop1("高级道具");
  91. Prop prop2= new Prop2("中级道具");
  92. Prop prop3= new Prop3("低级道具");
  93. //设置责任链
  94. prop1.NextProp = prop2;
  95. prop2.NextProp = prop3;
  96. //合成处理
  97. prop1.Behaviour(request);
  98. }
  99. }
  100. }

优缺点

优点:

       降低了请求的发送者和接收者之间的耦合;把多个条件判定分散到各个处理类中,使得代码更加清晰,责任更加明确。

缺点:

       在找到正确的处理对象之前,所有的条件判定都要执行一遍,当责任链过长时,可能会引起性能的问题;可能导致某个请求不被处理。

总结

       代码中存在多个if-else语句的情况下,此时可以考虑使用责任链模式来对代码进行重构。

注意

       这里举的例子,在实际开发过程中可能不会用到设计模式,希望各位读者切勿固步自封。

设计模式(C#)——12责任链模式的更多相关文章

  1. Python使用设计模式中的责任链模式与迭代器模式的示例

    Python使用设计模式中的责任链模式与迭代器模式的示例 这篇文章主要介绍了Python使用设计模式中的责任链模式与迭代器模式的示例,责任链模式与迭代器模式都可以被看作为行为型的设计模式,需要的朋友可 ...

  2. Java设计模式学习记录-责任链模式

    前言 已经把五个创建型设计模式和七个结构型设计模式介绍完了,从这篇开始要介绍行为型设计模式了,第一个要介绍的行为型设计模式就是责任链模式(又称职责链模式). 责任链模式 概念介绍 责任链模式是为了避免 ...

  3. 《java设计模式》之责任链模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  4. 《JAVA设计模式》之责任链模式(Chain of Responsibility)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  5. 重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 场地和场景的重要性 射击

  6. [设计模式] javascript 之 责任链模式

    责任链模式:定义 责任链接模式又称职责链模式,是一种对象的行为模式:它是一种链式结构,每个节点都有可能两种操作,要么处理该请求停止该请求操作,要么把请求转发到下一个节点,让下一个节点来处理请求:该模式 ...

  7. Java设计模式系列之责任链模式

    责任链模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道 ...

  8. 设计模式学习之责任链模式(Chain of Responsibility,行为型模式)(22)

    参考:http://www.cnblogs.com/zhili/p/ChainOfResponsibity.html 一.引言 在现实生活中,有很多请求并不是一个人说了就算的,例如面试时的工资,低于1 ...

  9. Java描述设计模式(15):责任链模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景描述 1.请假审批流程 公司常见的请假审批流程:请假天数 当 day<=3 天,项目经理审批 当 3<day<= ...

随机推荐

  1. 基础篇-1.2Java世界的规章制度(下)

    1 Java运算符 Java世界中的运算其实就是数学运算,而运算符就是其中的媒介. 算术运算符 操作符 描述 + 加法,对符号两边的数值相加 - 减法,符号左边的数减去右边的数 * 乘法,符号两边的数 ...

  2. spring读取xml配置文件(二)

    一.当spring解析完配置文件名的占位符后,就开始refresh容器 @Override public void refresh() throws BeansException, IllegalSt ...

  3. supervisor指南

    1 安装 yum install -y supervisor 如果提示没有这个安装包,则需要添加epel源 wget -O /etc/yum.repos.d/epel.repo http://mirr ...

  4. Ubuntu18.04服务器使用netplan网络构建桥接kvm虚拟机

    参考链接 Ubuntu 18.04 LTS安装KVM虚拟机 如何在 Ubuntu 18.04 服务器上安装和配置 KVM KVM日常管理和克隆 KVM详解 1.准备工作 首先需要检查一下CPU是否支持 ...

  5. 【JDK】JDK源码分析-Collection

    Java 集合框架(Java Collections Framework, JCF)包含很多平时开发中的常用类,例如 List.Set.ArrayList.HashMap.HashSet 等,因此打算 ...

  6. 【iOS】更新 CocoaPods 后 Podfile 报错

    更新了 CocoaPods 后,再执行 "pod install" 时报了如下错误: [!] The dependency `AFOnoResponseSerializer` is ...

  7. 夯实Java基础(六)——包装类

    1.包装类简介 我们都知道Java是面向对象编程语言,包含了8种基本数据类型,但是这8种基本数据类型并不支持面向对象的特征,它们既不是类,也不能调用方法.这在实际使用时存在很多的不便,比如int类型需 ...

  8. 编码规范 | Java函数优雅之道(上)

    导读 随着软件项目代码的日积月累,系统维护成本变得越来越高,是所有软件团队面临的共同问题.持续地优化代码,提高代码的质量,是提升系统生命力的有效手段之一.软件系统思维有句话“Less coding, ...

  9. javascript 异步请求封装成同步请求

    此方法是异步请求封装成同步请求,加上token验证,环境试用微信小程序,可以修改文件中的ajax,进行封装自己的,比如用axios等 成功码采用标准的 200 到 300 和304 ,需要可以自行修改 ...

  10. Java 8 Stream实践

    [**前面的话**]Java中的Stream于1.8版本析出,平时项目中也有用到,今天就系统的来实践一下.下面借用重庆力帆队伍中我个人比较喜欢的球员来操作一波,队员的年龄为了便于展示某些api做了调整 ...