• 不一样的职责链模式(设计模式一)


    背景

    把以前的设计模式整理下,也有一些在工作中对设计模式的体悟。
    准备写24篇吧,化名为二十四章经,第一章打算写职责链模式,也就是这一篇,是因为工作中除了单例用的最多的就是职责链了。
    下面的例子,比市面的介绍类的复杂一些吧,还是可以交流交流的。话不多说,开工吧。

    作用

    有些人喜欢针对设计模式去探讨优缺点,设计模式本身是非常完善的,更多的是一种解决方案,也就是只有合不合适这个概念。
    作用:可以让对一个对象进行单一方向传递性处理。

    例子

    对于职责,公司的职责是个很好的例子。比如说软件公司师A,做完了项目,交给小组长审核,小组长给了客户看,客户不满意,然后通知给小组长,小组长又通知开发人员A。

    public abstract class handle
    {
    	//角色
    	public string role;
    	// 责任人状态
    	public int state;
    	// 下一个责任者
    	protected handle nextHandle;
    	//上一个责任者
    	protected handle preHandle;
    
    	public handle(string role) {
    		this.role = role;
    	}
    	//设置下一个责任者
    	public void SetNextHandle(handle nextHandle) {
    		this.nextHandle = nextHandle;
    	}
    	//发送请求
    	public void SendRequest(handle handler,RequestMessage request) {
    		this.preHandle = handler;
    		if (IsSendRequest(request))
    		{
    			if (nextHandle != null)
    			{
    				nextHandle.SendRequest(this, request);
    			}
    		}
    		else
    		{
    			SendResponse(request);
    		}
    	}
    	// 处理回复请求
    	public void SendResponse(RequestMessage request)
    	{
    		if (IsSendResponse(request))
    		{
    			if (preHandle != null)
    			{
    				preHandle.SendResponse(request);
    			}
    		}
    	}
    	// 是否发送请求
    	protected abstract bool IsSendResponse(RequestMessage request);
    	// 是否继续向下传递请求
    	protected abstract bool IsSendRequest(RequestMessage request); 
    }
    

    这是一个很简单的抽象类,其中我实现了两个方法:

    1. SendRequest 用来判断是否传递给下一个责任者
    2. SendResponse 用来判断是否传递回责任者

    在这里我加入了责任人状态是为了方便演示。
    下面是请求的RequestMessage,也就是要给客户的资料模板。

    public class RequestMessage
    {
            //项目名
    	private string name;
            //内容
    	private string content;
            //符合客户的程度
    	private ushort grade;
    
    	public string Name {
    		get { return name; }
    		set { name = value; }
    	}
    
    	public string Content {
    		get { return content; }
    		set { content= value; }
    	}
    
    	public ushort Grade
    	{
    		get { return grade; }
    		set { grade = value; }
    	}
    }
    

    开发者:

    public class developer : handle
    {
    	public developer():base("软件工程师") {
    
    	}
    	protected override bool IsSendRequest(RequestMessage request)
    	{
    		return true;
    	}
    
    	protected override bool IsSendResponse(RequestMessage request)
    	{
    		//fix bug 客户不满意苦逼改代码
    		System.Console.WriteLine("苦逼优化");
    		return false;
    	}
    }
    

    在软件开发工程师角色中,IsSendRequest无论如何都为true,不可能自我认可,然后就ok的。

    public class Manager : handle
    {
    	public Manager() : base("小组长")
    	{
    	}
    
    	protected override bool IsSendRequest(RequestMessage request)
    	{
    		if (request.Grade >= 8)
    		{
    			return true;
    		}
    		else
    		{
    			return false;
    		}
    	}
    
    	protected override bool IsSendResponse(RequestMessage request)
    	{
    		if (request.Grade > 6)
    		{
    			System.Console.Write("客户沟通一下");
    			return false;
    		}
    		else
    		{
    			return true;
    		}
    	}
    }
    

    在小组长角色中,如果开发到了8分直接给客户,如果每到8分,到了6分,和客户商量,如果6分不到直接让程序员改代码。

    public class Client : handle
    {
    	public int Grade;
    
    	public Client(int Grade) : base("客户")
    	{
    		this.Grade = Grade;
    	} 
    
    	protected override bool IsSendRequest(RequestMessage request)
    	{
    		return false;
    	}
    
    	protected override bool IsSendResponse(RequestMessage request)
    	{
    		if (request.Grade * 0.8 >= Grade)
    		{
    			return false;
    		}
    		else
    		{
    			request.Grade = (unshort)(request.Grade * 0.8);
    		}
    		return true;
    	}
    }
    

    在客户角色中假设客户评分,是软件开发人员的0.8,然后如果大于客户心中的评分就过,小于就打回,并把自己的评分发送回去。
    执行代码如下:

    static void Main(string[] args)
    {
    	developer developerA = new developer();
    	Manager managerB = new Manager();
    	Client clientC = new Client(9);
    	developerA.SetNextHandle(managerB);
    	managerB.SetNextHandle(clientC);
    	RequestMessage requestMessage = new RequestMessage();
    	requestMessage.Name = "某某项目";
    	requestMessage.Content = "某功能ok";
    	requestMessage.Grade = 8;//自我评分8分
    	// 发送这个请求
    	developerA.SendRequest(developerA, requestMessage);
    }
    

    得到的结果是重新优化代码,当软件工程师自我评分为10的时候,客户评分还是9的时候,小组长会与客户交流。
    什么客户直接满意?为何会有如此问题?

    总结

    职责链在日常中还是出现挺多的,用起来感觉解决了不少问题。

  • 相关阅读:
    抽象类使用细节
    super关键字
    JDK,JRE,JVM三者之间的爱恨情仇
    LinkedHashSet
    HashSet扩容成红黑树机制
    Set之HashSet
    finally关键字
    Hashcode方法
    equals方法和==的区别
    LinkedList
  • 原文地址:https://www.cnblogs.com/aoximin/p/12046378.html
Copyright © 2020-2023  润新知