zoukankan      html  css  js  c++  java
  • C#

    问题场景

    一个请假的申请需要经过判定才能交给不同的上级进行处理,比如请假一天,需要需要副总经理确认,请假三天,需要总经理确认,请假三天以上需要董事长批准。如果使用条件语句来判定请假天数,新加入一个条件就得修改原来已经写好的代码,为了保证开闭原则的有效性,可以使用责任链模式。

    总结模式

    责任链相当于一个处理请求的管道,每个管道都持有它的上级管道的抽象引用,以便可以在处理请求之后把请求再转发给上级。

    示例代码

    以下是一个非常简陋的例子

    public abstract class AbstractManager
    {
        public AbstractManager Manager { get; set; }
        public abstract void Request(int day );
    }

    //董事长
    public class Chairman : AbstractManager
    {
        public override void Request(int day )
        {
            if (day > 3) { Console.WriteLine( "嗯,批准请假" ); }          
        }
    }

    //经理
    public class Manager : AbstractManager
    {
        public override void Request( int day )
        {
            if (day < 3) { Console.WriteLine( "嗯,批准请假" ); }
            else
            {
                Console.WriteLine( "嗯,我批准请假,但你的情况还需要董事长批准" );
                if (Manager != null) { Manager.Request( day ); }
            }
        }
    }

    public class Programe
    {
        static void Main( string[] args )
        {
            AbstractManager abstractManager = new Manager( );
            abstractManager.Manager = new Chairman( );
            abstractManager.Request( 5 );
        }
    }

    实际上责任链和装饰者差不多,改写一下也就是个装饰者模式

    public abstract class AbstractManager
    {
        protected AbstractManager Manager { get; set; }
        public abstract void Request(int day );
    }

    //董事长
    public class Chairman : AbstractManager
    {
        public override void Request(int day )
        {
            if (day > 3) { Console.WriteLine( "嗯,批准请假" ); }          
        }
    }

    //经理
    public class Manager : AbstractManager
    {
        public Manager( AbstractManager abstractManager )
        {
            Manager = abstractManager;
        }
        public override void Request( int day )
        {
            if (day < 3) { Console.WriteLine( "嗯,批准请假" ); }
            else
            {
                Console.WriteLine( "嗯,我批准请假,但你的情况还需要董事长批准" );
                if (Manager != null) { Manager.Request( day ); }
            }
        }
    }

    public class Programe
    {
        static void Main( string[] args )
        {
            AbstractManager Chairman = new Chairman( );
            AbstractManager Manager = new Manager( Chairman );
            Manager.Request( 5 );
        }
    }

     

      

     

    C# - 设计模式目录

  • 相关阅读:
    随手记
    jira默认是jira_user用户组的用户有登录jira的权限 上海
    loadrunner11安装 上海
    虚拟机增加内存方法 上海
    centos6中安装VMware Tools 上海
    linux安装过程中遇到的一些问题总结 上海
    C语言指针方法对字符串进行去重 上海
    在linux环境下搭建JDK+JAVA+Mysql,并完成jforum的安装 上海
    关于pl/sql打开后database为空的问题解决办法 上海
    字符串表达式求值(支持多种类型运算符)
  • 原文地址:https://www.cnblogs.com/myrocknroll/p/8604447.html
Copyright © 2011-2022 走看看