16、面向对象语言的23种设计模式-责任链模式

一、什么是责任链模式

可以想象成一条链子,环环相扣,并且其中的环节顺序可变,数量可变,大概就这么个意思。

二、责任链模式的作用

就是解决多个环节的需求,并且环节可扩展变化等等。。

三、责任链模式的使用场景

比如审批流程,这种情况就很适合使用责任链模式。

四、如何实现责任链模式

此例是一个物品保存的一个流程,当物品大小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);
            }
        }
    }
}

大概就是这么个意思,每个角色都有他的职责,他能联系他自身的上下级,不要越级,当流程中间有变化的时候,只需要改改传入的对象就可以了,也可以删除某个环节也是可以的。

以上为本章所有内容。

完。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊脑袋_YA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值