苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper万能框架(V2.3-含.netcore) HttpHelper官方出品,无敌框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 最牛的爬虫类,没有爬不到只有想不到 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 515|回复: 5

[学习心得] C#行为模式列子

[复制链接]
发表于 2019-1-10 10:12:20 | 显示全部楼层 |阅读模式
一 、  责任链模式的实际应用案例

下面的责任链模式代码演示了不同职务的人根据所设定的权限对一个购买请求作出决策或将其交给更高的决策者。


3.png


[C#] 纯文本查看 复制代码
using System;
// "Handler"
abstract class Approver
{
    // Fields
    protected string name;
    protected Approver successor;
    // Constructors
    protected Approver(string name)
    {
        this.name = name;
    }
    // Methods
    public void SetSuccessor(Approver successor)
    {
        this.successor = successor;
    }
    public abstract void ProcessRequest(PurchaseRequest request);
}
// "ConcreteHandler"
class Director : Approver
{
    // Constructors
    public Director(string name) : base(name) { }
    // Methods
    public override void ProcessRequest(PurchaseRequest request)
    {
        if (request.Amount < 10000.0)
            Console.WriteLine("{0} {1} approved request# {2}",
            this, name, request.Number);
        else
            if (successor != null)
                successor.ProcessRequest(request);
    }
}
// "ConcreteHandler"
class VicePresident : Approver
{
    // Constructors
    public VicePresident(string name) : base(name) { }
    // Methods
    public override void ProcessRequest(PurchaseRequest request)
    {
        if (request.Amount < 25000.0)
            Console.WriteLine("{0} {1} approved request# {2}",
            this, name, request.Number);
        else
            if (successor != null)
                successor.ProcessRequest(request);
    }
}
// "ConcreteHandler"
class President : Approver
{
    // Constructors
    public President(string name) : base(name) { }
    // Methods
    public override void ProcessRequest(PurchaseRequest request)
    {
        if (request.Amount < 100000.0)
            Console.WriteLine("{0} {1} approved request# {2}",
            this, name, request.Number);
        else
            Console.WriteLine("Request# {0} requires " +
            "an executive meeting!", request.Number);
    }
}
// Request details
class PurchaseRequest
{
    // Member Fields
    // Constructors
    public PurchaseRequest(int number,
    double amount, string purpose)
    {
        Number = number;
        Amount = amount;
        Purpose = purpose;
    }
    // Properties
    public double Amount { get; set; }

    public string Purpose { get; set; }

    public int Number { get; set; }
}
/// <summary>
/// ChainApp Application
/// </summary>
public class ChainApp
{
    public static void Main(string[] args)
    {
        // Setup Chain of Responsibility
        Director Larry = new Director("Larry");
        VicePresident Sam = new VicePresident("Sam");
        President Tammy = new President("Tammy");
        Larry.SetSuccessor(Sam);
        Sam.SetSuccessor(Tammy);
        // Generate and process different requests
        PurchaseRequest rs = new PurchaseRequest(2034, 350.00, "Supplies");
        Larry.ProcessRequest(rs);
        PurchaseRequest rx = new PurchaseRequest(2035, 32590.10, "Project X");
        Larry.ProcessRequest(rx);
        PurchaseRequest ry = new PurchaseRequest(2036, 122100.00, "Project Y");
        Larry.ProcessRequest(ry);
    }
}


二 、  责任链模式的实现

    责任链模式并不创建责任链。责任链的创建必须由系统的其它部分创建出来。

    责任链模式降低了请求的发送端和接收端之间的耦合,使多个对象都有机会处理这个请求。一个链可以是一条线,
一个树,也可以是一个环。如下图所示,责任链是一个树结构的一部分。

2.png


发表于 2019-1-10 11:00:44 | 显示全部楼层
发表于 2019-1-10 14:03:55 | 显示全部楼层
发表于 2019-1-10 14:20:17 | 显示全部楼层
发表于 2019-1-10 14:32:58 | 显示全部楼层
发表于 2019-1-10 16:46:50 | 显示全部楼层
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备17001017号-1)

GMT+8, 2019-12-7 23:03

© 2017-2018

快速回复 返回顶部 返回列表