背景
把以前的设计模式整理下,也有一些在工作中对设计模式的体悟。
准备写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);
}
这是一个很简单的抽象类,其中我实现了两个方法:
- SendRequest 用来判断是否传递给下一个责任者
- 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的时候,小组长会与客户交流。
什么客户直接满意?为何会有如此问题?
总结
职责链在日常中还是出现挺多的,用起来感觉解决了不少问题。