zoukankan      html  css  js  c++  java
  • 设计模式--职责链模式

    使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

    使得接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接收者的引用。这也大大降低了耦合度。

    由于是在客户端来定义链的结构,也就是可以随时地增加或修改处理一个请求的结构。增强了给对象指派职责的灵活性。

    //申请
    class Request
    {
    //申请类别
    public string RequestType { get; set; }
    //申请内容
    public string RequestContent { get; set; }
    //数量
    public int Number { get; set; }
    }

    //定义管理者抽象类

    abstract class Manager
    {
    protected string name;
    //管理者的上级
    protected Manager supperior;

    public Manager(string name)
    {
    this.name = name;
    }
    //设置管理者的上级
    public void SetSuperlior(Manager manager)
    {
    this.supperior = manager;
    }
    //申请请求
    public abstract void RequestApplications(Request request);

    }

    //实现管理者类

    //经理
    class CommonManager : Manager
    {
    public CommonManager(string name) : base(name)
    {
    }

    public override void RequestApplications(Request request)
    {
    if(request.RequestType.Equals("请假")&&request.Number<=2)
    {
    Console.WriteLine("{0}:{1} 数量:{2}被批准", name, request.RequestContent, request.Number);
    }
    else
    {
    if(supperior!=null)
    {
    supperior.RequestApplications(request);
    }
    }

    }
    }

    //总监
    class Majordomo : Manager
    {
    public Majordomo(string name) : base(name)
    {
    }

    public override void RequestApplications(Request request)
    {
    if(request.RequestType.Equals("请假")&&request.Number<=5)
    {
    Console.WriteLine("{0}:{1} 数量:{2}被批准", name, request.RequestContent, request.Number);
    }
    else
    {
    if(supperior!=null)
    {
    supperior.RequestApplications(request);
    }
    }
    }
    }

    //总经理
    class GeneralManager : Manager
    {
    public GeneralManager(string name) : base(name)
    {
    }

    public override void RequestApplications(Request request)
    {
    if(request.RequestType.Equals("请假"))
    {
    Console.WriteLine("{0}:{1} 数量{2}被批准", name, request.RequestContent, request.Number);
    }
    else if(request.RequestType.Equals("加薪")&&request.Number<=5000)
    {
    Console.WriteLine("{0}:{1} 数量{2}被批准", name, request.RequestContent, request.Number);
    }
    else if(request.RequestType.Equals("加薪")&&request.Number>5000)
    {
    Console.WriteLine("{0}:{1} 数量{2}再说吧", name, request.RequestContent, request.Number);
    }
    }
    }

    调用:

    CommonManager jinli = new CommonManager("jinli");
    Majordomo zongjian = new Majordomo("zongjian");
    GeneralManager zhongjingli= new GeneralManager("zongjingli");

    //上级可以任意设置

    jinli.SetSuperlior(zongjian);
    zongjian.SetSuperlior(zhongjingli);

    Request req = new Request()
    {
    RequestType = "请假",
    RequestContent = "小菜请假",
    Number = 1
    };
    jinli.RequestApplications(req);

    req = new Request()
    {
    RequestType = "请假",
    RequestContent = "小菜请假",
    Number =10
    };
    jinli.RequestApplications(req);

    req = new Request()
    {
    RequestType = "请假",
    RequestContent = "小菜请假",
    Number = 3
    };
    jinli.RequestApplications(req);

    req = new Request()
    {
    RequestType = "加薪",
    RequestContent = "小菜请求加薪",
    Number = 5000
    };
    jinli.RequestApplications(req);

    req = new Request()
    {
    RequestType = "加薪",
    RequestContent = "小菜请求加薪",
    Number = 10000
    };
    jinli.RequestApplications(req);

  • 相关阅读:
    POJ 2492 并查集扩展(判断同性恋问题)
    菜鸟带你飞______DP基础26道水题
    HDU 1978 记忆化搜索(dfs+dp)
    HDU 1203 I NEED A OFFER (01背包&&概率dp)
    HDU 1176免费馅饼 DP数塔问题转化
    HDU 1069&&HDU 1087 (DP 最长序列之和)
    最短路&&最小生成树水题
    POJ 1797 Heavy Transportation (Dijkstra变形)
    数论学习笔记
    Codeforces Round #579 (Div. 3)
  • 原文地址:https://www.cnblogs.com/buzhidaojiaoshenme/p/6732132.html
Copyright © 2011-2022 走看看