一、什么是责任链模式
可以想象成一条链子,环环相扣,并且其中的环节顺序可变,数量可变,大概就这么个意思。
二、责任链模式的作用
就是解决多个环节的需求,并且环节可扩展变化等等。。
三、责任链模式的使用场景
比如审批流程,这种情况就很适合使用责任链模式。
四、如何实现责任链模式
此例是一个物品保存的一个流程,当物品大小size<=2就是张三保存,>2是李四保存,>4是王五保存,>6是仓库保存
这里就直接写最终的解决方式,懒得一步步升级了。。
这里面有些地方都是可以继续修改的,我就不改了。。
主程序:
namespace Responsibility
{
class Program
{
static void Main(string[] args)
{
List<GoodsObj> goodsObjs = new List<GoodsObj>()
{
new GoodsObj()
{
Name = "物品1",
Size = 10
},
new GoodsObj()
{
Name = "物品2",
Size = 2
},
new GoodsObj()
{
Name = "物品3",
Size = 4
},
new GoodsObj()
{
Name = "物品4",
Size = 6
},
new GoodsObj()
{
Name = "物品5",
Size = 1
},
new GoodsObj()
{
Name = "物品6",
Size = 5
}
};
AbstractPurchase collection = new Collection()
{
Name = "张三"
};
AbstractPurchase captain = new Captain()
{
Name = "李四"
};
AbstractPurchase administrators = new Administrators()
{
Name = "王五"
};
collection.SetPurchaseObj(captain);
captain.SetPurchaseObj(administrators);
foreach (GoodsObj goodsObj in goodsObjs)
{
collection.Handle(goodsObj);
}
}
}
}
物品对象GoodsObj.cs:
namespace Responsibility
{
public class GoodsObj
{
public string Name { get; set; }
public int Size { get; set; }
}
}
抽象类,物品保存类AbstractPurchase.cs:
namespace Responsibility
{
public abstract class AbstractPurchase
{
public string Name { get; set; }
protected AbstractPurchase _PurchaseObj = null;
public void SetPurchaseObj(AbstractPurchase purchaseObj)
{
this._PurchaseObj = purchaseObj;
}
public abstract void Handle(GoodsObj userObj);
public virtual void Preservation(GoodsObj userObj)
{
Console.WriteLine($"{Name}自己保存:{userObj.Name},大小:{userObj.Size}");
}
}
}
角色:
//采集员Collection.cs
namespace Responsibility
{
public class Collection : AbstractPurchase
{
public override void Handle(GoodsObj userObj)
{
if (userObj.Size > 2)
{
base._PurchaseObj.Handle(userObj);
}
else
{
base.Preservation(userObj);
}
}
}
}
//队长Captain.cs
namespace Responsibility
{
public class Captain : AbstractPurchase
{
public override void Handle(GoodsObj userObj)
{
if (userObj.Size > 4)
{
base._PurchaseObj.Handle(userObj);
}
else
{
base.Preservation(userObj);
}
}
}
}
//仓库管理员Administrators.cs
namespace Responsibility
{
public class Administrators : AbstractPurchase
{
public override void Handle(GoodsObj userObj)
{
if (userObj.Size > 6)
{
Console.WriteLine($"放仓库保存{userObj.Name}");
}
else
{
base.Preservation(userObj);
}
}
}
}
大概就是这么个意思,每个角色都有他的职责,他能联系他自身的上下级,不要越级,当流程中间有变化的时候,只需要改改传入的对象就可以了,也可以删除某个环节也是可以的。
以上为本章所有内容。
完。