欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > UNITY_GOF_ChainOfResponsibility

UNITY_GOF_ChainOfResponsibility

2025/9/19 23:02:54 来源:https://blog.csdn.net/m0_52021450/article/details/144184836  浏览:    关键词:UNITY_GOF_ChainOfResponsibility
责任链模式

经理和高管可以响应采购请求或将其移交给上级。
每个位置都可以有自己的一套规则,他们可以批准这些订单。

  • 首先有一个领导类专门负责处理这些请求
  • 之后根据权限分别对子类进行处理
  • 在调用的时候会根据处理类的权限进行处理,如果权限不足就传递给下一级别
public class ChainOfResponsibility:MonoBehaviour{void Start{Approver llw = new Director();Approver al = new ViceScident();Approver mcl = new Prescident();llw.SetSuccessor(al);al.SetSuccessor(mcl);Purchase purchase = new Purchase(900.00,90,"Assets");llw.ProcessRequest(purchase);purchase = new Purchase(4001.21,29,"");llw.ProcessRequest(purchase);purchase = new Purchase(100021,890,"");}/// 负责处理请求的基类(领导)public class Approver{protected Approver successor; // 上级public void SetSuccessor(Approver successor){this.successor = successor;}public abstract  void ProcessRequest(Purchase purchase);}public class Purchase{private float m_amount; //金额private int m_number; //采购数量private string m_purpose; // 目的// 赋值public Purchase(float m_amount,int m_number,string m_purpose){this.m_purpose = m_purpose;this.m_amount = m_amount;this.m_number = m_number; }public float Amount{get{return m_amount;}set{m_amount = value;}}public int Number{get{return m_number;}set{m_number = value;}}public string Purpose{get{return m_purpose;}set{m_purpose = value;}}}public class Director:Approver{if (purchase.Amount < 10000.0){Debug.Log(this.GetType().Name+" approved request# "+purchase.Number);}else if (successor != null){successor.ProcessRequest(purchase);}}public calss Prescident:Approver{if (purchase.Amount < 100000.0){Debug.Log(this.GetType().Name+" approved request# "+purchase.Number);}else {Debug.Log("Request# "+purchase.Number+ "requires an executive meeting!");}}public class VivePrescident:Approver{public override void ProcessRequest(Purchase purchase){if (purchase.Amount < 50000.0){Debug.Log(this.GetType().Name+" approved request# "+purchase.Number);}else if (successor != null){successor.ProcessRequest(purchase);}}}
}

根据提供的计算类型进行计算

public class ChainOfResponsibility2 : MonoBehaviour{void Start(){IChainOfCalc calc1 = new AddNumbers();IChainOfCalc calc2 = new SubstractNumbers();IChainOfCalc calc3 = new DivideNumbers();IChainOfCalc calc4 = new MultiplyNumbers();calc1.SetNextChain(calc2);calc2.SetNextChain(calc3);calc3.SetNextChain(calc4);Number myNumbers = new Number(3, 5, CalculationType.Add);calc1.Calculate(myNumbers);// another example:Number myOtherNumbers = new Number(6, 2, CalculationType.Multiply);calc1.Calculate(myOtherNumbers);// or pass it to some chain object inbetween which will not work in this case:Number myLastNumbers = new Number(12, 3, CalculationType.Subtract);calc3.Calculate(myLastNumbers);		}// 计算的类型public enum CalculationType{Add,Subtract,Divide,Multiply};public interface IChainOfCalc{void SetNextChain(IChainOfCalc nextChain);void Calculate(Number number);}public class Number{public int Num1{get; protected set;}public int Num2{get; protected set;}public CalculationType CalcType{get; protected set;}public Number(int num1, int num2 , CalculationType calc){this.Num1 = num1;this.Num2 = num2;this.CalcType = calc;}}public class AddNumber : IChainOfCalc{protected IChainOfCalc nextChain; public void  SetNextChain(IChainOfCalc nextChain){this.nextChain = nextChain;}public void Calculate(Number request){if(request.CalcType == CalculationType.Add){Debug.Log("Adding: " + request.number1 + " + " + request.number2 + " = " + (request.number1 + request.number2).ToString());}else if(nextInChain != null)nextInChain.Calculate(request);elseDebug.Log ("Handling of request failed: " + request.calculationWanted);}}public class SubtractNumber : IChainOfCalc{protected IChainOfCalc nextInChain;public void SetNextChain(IChainOfCalc nextChain){this.nextInChain = nextChain;}public void Calculate(Number request){if(request.CalcType == CalculationType.Subtract){Debug.Log("Substracting: " + request.number1 + " - " + request.number2 + " = " + (request.number1 - request.number2).ToString());}else if(nextInChain != null)nextInChain.Calculate(request);elseDebug.Log ("Handling of request failed: " + request.calculationWanted);}}public class DivideNumber : IChainOfCalc{protected IChainOfCalc nextInChain;public void SetNextChain(IChainOfCalc nextChain){this.nextInChain = nextChain;}public void Calculate(Number request){if(request.CalcType == CalculationType.Divide){Debug.Log("Dividing: " + request.number1 + " / " + request.number2 + " = " + (request.number1 / request.number2).ToString());}else if(nextInChain != null)nextInChain.Calculate(request);elseDebug.Log ("Handling of request failed: " + request.calculationWanted);}}public class MultiplyNumber : IChainOfCalc{protected IChainOfCalc nextInChain;public void SetNextChain(IChainOfCalc nextChain){this.nextInChain = nextChain;}public void Calculate(Number request){if(request.CalcType == CalculationType.Multiply){Debug.Log("Multiplying: " + request.number1 + " * " + request.number2 + " = " + (request.number1 * request.number2).ToString());}else if(nextInChain != null)nextInChain.Calculate(request);elseDebug.Log ("Handling of request failed: " + request.calculationWanted);}}
}

最后根据上述思路可以在Unity写出一个关卡选择器等等

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词