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

背景

把以前的设计模式整理下,也有一些在工作中对设计模式的体悟。
准备写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的时候,小组长会与客户交流。
什么客户直接满意?为何会有如此问题?

总结

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

posted @ 2019-12-16 09:47  敖毛毛  阅读(544)  评论(0编辑  收藏  举报