`
tsdl2009
  • 浏览: 5735 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

面试题-银行调度系统

阅读更多
银行业务调度系统



模拟实现银行业务调度系统逻辑,具体需求如下:

银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。
有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。
异步随机生成各种类型的客户,生成各类型用户的概率比例为:
        VIP客户:普通客户:快速客户  =  1 :6 :3。

客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。
各类型客户在其对应窗口按顺序依次办理业务。
当VIP(6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。
随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。
不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
    通过看了上面的面试题,经过了一些时间的思考,我用了C#简单地编写了一个。
    开发步骤:1、首先,根据系统的需求,分析一下类的设计,对于业务窗口类,我可以认为因为有3种类型的窗口,所以分为3种不同的银行员(Employee),它完成以下两件事:(1)从队列获取客户(GetCustomer),办理业务(DoBusiness)。对于客户(Customer)类,虽然有3种不同的客户,但是因为有共同点,所以不对其特征进行任何抽象,仅认为所有的客户都有一个需要办理的业务时间(BusinessTime)而已,当然,我们利用工厂模式,设一个CustomerFactory类,来产生3种不同的客户,并且把他们放到三个不同的队列中去。最后,我们还需创建一个Bank类用于保存三个客户队列,这里为了简单,我们创建三个全局静态队列
      2、理清业务逻辑:
      通过上面的分析,业务流程如下:
      Employee类是业务窗口,负责不停地查询三个队列,获取客户,然后针对客户办理业务,每个Employee实例都需要一个单独的线程。所以,有两种操作:GetCustomer和DoBusiness。
    Customer类则是很简单,仅仅有办理的业务时间(BusinessTime),保存在三个队列中。
    CustomerFactory类是一个单独的工厂类,用于随机生产不同的客户并把其加入到不同的队列中,这需要一个单独的线程来控制。
    Bank类保存三个客户队列,并且对其进行维护。
    3、进行编码
     首先编写Employee类,这里我想,先来编写普通业务窗口类,然后,VIP窗口和快速窗口继承自普通窗口。因为它们是泛化关系。源代码如下:
     普通业务窗口

view plaincopy to clipboardprint?
/// <summary>  
   /// 普通员工,普通业务窗口  
   /// </summary>  
   public class Employee  
   {  
       /// <summary>  
       /// 员工名  
       /// </summary>  
       public string Name  
       {  
           get;  
           set;  
       }  
 
       protected Thread thread;  
 
       public Employee()  
       {  
           thread = new Thread(new ThreadStart(DoBusiness));  
           thread.Start();  
       }  
       /// <summary>  
       /// 当前办理业务的客户  
       /// </summary>  
       protected Customer currentCustomer;  
         
 
       /// <summary>  
       /// 获取下一个要处理的客户  
       /// </summary>  
       protected virtual void GetCustomer()  
       {  
           currentCustomer = Bank.GetNormalCustomer();  
       }  
 
       protected void DoBusiness()  
       {  
           //不停地工作  
           while (true)  
           {  
               GetCustomer();  
               if (currentCustomer != null)//为客户办理业务  
               {  
                   Info.AddBeginBusinessInfo(this, currentCustomer);  
                   Thread.Sleep(currentCustomer.BusinessTime);  
                   Info.AddEndBusinessInfo(this, currentCustomer);  
               }  
           }  
             
       }  
 
       /// <summary>  
       /// 停止工作  
       /// </summary>  
       public void Stop()  
       {  
           thread.Abort();  
           thread.Join();  
       }  
   } 
VIP窗口和快速窗口继承自普通窗口,仅重写GetCustomer方法即可

/// <summary>  
/// VIP业务窗口  
/// </summary>  
public class VipEmployee:Employee  
{  
    protected override void GetCustomer()  
    {  
        currentCustomer = Bank.GetVipCustomer();//获取VIP客户  
        if (currentCustomer == null)  
        {  
              
            //没有VIP客户的情况下,获取普通客户  
            currentCustomer = Bank.GetNormalCustomer();  
        }  
    }  
}  
 
/// <summary>  
/// 快速业务窗口  
/// </summary>  
public class QuickEmployee:Employee  
{  
    protected override void GetCustomer()  
    {  
        currentCustomer = Bank.GetQuickCustomer();  
    }  
}
接着, 客户类Customer

/// <summary>  
/// 客户  
/// </summary>  
public class Customer  
{  
    /// <summary>  
    /// 客户名  
    /// </summary>  
    public string Name  
    {  
        get;  
        set;  
    }  
 
    /// <summary>  
    /// 客户办理业务所需的时间  
    /// </summary>  
    public TimeSpan BusinessTime  
    {  
        get;  
        set;  
    }  
}
然后,利用一个简单工厂生产客户Customer
view plaincopy to clipboardprint?
/// <summary>  
  /// 工厂生成类  
  /// </summary>  
  public class CustomerFactory  
  {  
      static TimeSpan totalWorkTime = new TimeSpan(0, 5,0);//总共工作5分钟  
      static TimeSpan interval = new TimeSpan(0, 0, 10);//每10秒产生一个客户  
      static TimeSpan maxTime=new TimeSpan(0,0,100);//客户最多办理业务100秒  
      static TimeSpan minTime=new TimeSpan(0,0,10);//客户最少办理业务10秒  
 
 
      static Random rnd = new Random();//随机种子  
      public static void CreateCustomer()  
      {  
          DateTime beginTime = DateTime.Now;  
          DateTime endTime = DateTime.Now;  
           
          Customer customer = null;  
          int count=1;//已生成客户的数量  
          while ((endTime - beginTime) < totalWorkTime)  
          {  
              //随机生成办理业务的时间  
              TimeSpan time=new TimeSpan(0,0,rnd.Next (minTime.Seconds,maxTime.Seconds+1));  
 
              switch (rnd.Next(10))  
              {  
                  case 0:  
                      customer = new Customer { Name = "VIP客户" + count.ToString(), BusinessTime = time };  
                      Bank.AddVipCustomer(customer);  
                      break;  
                  case 1:  
                  case 2:  
                  case 3:  
                  case 4:  
                  case 5:  
                  case 6:  
                      customer = new Customer { Name = "普通客户" + count.ToString(), BusinessTime = time };  
                      Bank.AddNormalCustomer(customer);  
                      break;  
                  default:  
                      customer = new Customer { Name = "快速客户" + count.ToString(), BusinessTime = minTime };  
                      Bank.AddQuickCustomer(customer);  
                      break;  
              }  
              count++;  
              Thread.Sleep(interval);  
              endTime = DateTime.Now;  
          }  
      }  
 
  } 


最好是Bank类。
view plaincopy to clipboardprint?
public class Bank  
   {  
       /// <summary>  
       /// 普通客户队列  
       /// </summary>  
       readonly static Queue<Customer> NormalCustomer;  
 
       /// <summary>  
       /// Vip客户队列  
       /// </summary>  
       readonly static Queue<Customer> VipCustomer;  
 
       /// <summary>  
       /// 快速客户队列  
       /// </summary>  
       readonly static Queue<Customer> QuickCustomer;  
 
 
       static Bank()  
       {  
           //初始化三个队列  
           NormalCustomer = new Queue<Customer>();  
           VipCustomer = new Queue<Customer>();  
           QuickCustomer = new Queue<Customer>();  
       }  
 
      /// <summary>  
      /// 从队列头获取普通客户,如果队列为空,返回null  
      /// </summary>  
      /// <returns>获取的客户</returns>  
       public static Customer GetNormalCustomer()  
       {  
           lock (NormalCustomer)  
           {  
               if (NormalCustomer.Count > 0)  
                   return NormalCustomer.Dequeue();  
               return null;  
           }  
       }  
 
       /// <summary>  
       /// 增加普通客户到队列尾部  
       /// </summary>  
       /// <param name="customer">要增加的客户</param>  
       public static void AddNormalCustomer(Customer customer)  
       {  
           Info.AddInfo(customer, NormalCustomer);  
           NormalCustomer.Enqueue(customer);  
 
       }  
 
 
       /// <summary>  
       /// 从队列头获取VIP客户,如果队列为空,返回null  
       /// </summary>  
       /// <returns>获取的客户</returns>  
       public static Customer GetVipCustomer()  
       {  
           lock (VipCustomer)  
           {  
               if (VipCustomer.Count > 0)  
                   return VipCustomer.Dequeue();  
               return null;  
           }  
       }  
 
       /// <summary>  
       /// 增加VIP客户到队列尾部  
       /// </summary>  
       /// <param name="customer">要增加的客户</param>  
       public static void AddVipCustomer(Customer customer)  
       {  
           Info.AddInfo(customer, VipCustomer);  
           VipCustomer.Enqueue(customer);  
 
 
       }  
 
 
       /// <summary>  
       /// 从队列头获取快速客户,如果队列为空,返回null  
       /// </summary>  
       /// <returns>获取的客户</returns>  
       public static Customer GetQuickCustomer()  
       {  
           lock (QuickCustomer)  
           {  
               if (QuickCustomer.Count > 0)  
                   return QuickCustomer.Dequeue();  
               return null;  
           }  
       }  
 
       /// <summary>  
       /// 增加快速客户到队列尾部  
       /// </summary>  
       /// <param name="customer">要增加的客户</param>  
       public static void AddQuickCustomer(Customer customer)  
       {  
           Info.AddInfo(customer, QuickCustomer);  
           QuickCustomer.Enqueue(customer);  
 
 
       }  
   } 
为了防止队列异常和多线程冲突,简单地封装了对三个队列的获取和加入方法。
其中的Info类是输出信息用的,比较简单,方便日后重构用的。
class Info  
{  
     public static void AddInfo(Customer customer,ICollection<Customer> queue)  
     {  
         Console.WriteLine("{0}:{1}加入等待队列,前面有{2}人等待。", DateTime.Now, customer.Name,queue.Count);  
     }  
 
     public static void AddBeginBusinessInfo(Employee employee, Customer customer)  
     {  
         Console.WriteLine("{0}:{1}开始为{2}办理业务。", DateTime.Now, employee.Name, customer.Name);  
     }  
 
     public static void AddEndBusinessInfo(Employee employee, Customer customer)  
     {  
         Console.WriteLine("{0}:{1}为{2}办理业务结束。", DateTime.Now, employee.Name, customer.Name);  
     }  

   class Info
    {
        public static void AddInfo(Customer customer,ICollection queue)
        {
            Console.WriteLine("{0}:{1}加入等待队列,前面有{2}人等待。", DateTime.Now, customer.Name,queue.Count);
        }

        public static void AddBeginBusinessInfo(Employee employee, Customer customer)
        {
            Console.WriteLine("{0}:{1}开始为{2}办理业务。", DateTime.Now, employee.Name, customer.Name);
        }

        public static void AddEndBusinessInfo(Employee employee, Customer customer)
        {
            Console.WriteLine("{0}:{1}为{2}办理业务结束。", DateTime.Now, employee.Name, customer.Name);
        }
    }
最后,在函数入库进行调用就行了。这样,基本上整个系统的功能实现了。

  static void Main(string[] args)  
{  
    List<Employee> all = new List<Employee>  
    {  
        new Employee { Name = "普通业务窗口1" },  
        new Employee { Name = "普通业务窗口2" },  
        new Employee { Name = "普通业务窗口3" },  
        new Employee { Name = "普通业务窗口4" },  
        new VipEmployee { Name = "VIP业务窗口" },  
        new QuickEmployee { Name = "快速业务窗口" }  
    };  
 
      
 
    Thread thd = new Thread(new ThreadStart(CustomerFactory.CreateCustomer));  
    thd.Start();  

    经过,对这个系统的分析,虽然,其中的有参考网上的资料,但是大部分都是自己深刻理解的,因此使我有很大收获,不仅对一个系统分析能力提高了,而且,也锻炼了我的代码编写能力。



   
   
    


分享到:
评论

相关推荐

    02-7K月薪面试题破解之二_银行业务调度系统视频教程

    02-7K月薪面试题破解之二_银行业务调度系统视频教程 02-7K月薪面试题破解之二_银行业务调度系统视频教程 02-7K月薪面试题破解之二_银行业务调度系统视频教程 02-7K月薪面试题破解之二_银行业务调度系统视频教程 02-...

    软通动力面试题——银行业务调度系统

    "软通动力面试题——银行业务调度系统" 在本篇文章中,我们将对软通动力的银行业务调度系统面试题进行详细的分析和解释。该系统模拟了银行业务调度系统的逻辑,涵盖了客户分类、窗口管理、业务办理时间等多个方面。...

    面试题——银行业务调度系统-源代码

    【标题】:“面试题——银行业务调度系统-源代码”涉及的是一个基于JavaSE的银行后台管理系统,旨在处理银行日常的业务调度问题。这个系统可能是为了模拟或优化银行内部的工作流程,例如账户管理、交易处理、客户...

    银行业务调度系统需求及面试题及代码

    其次,银行业务调度系统面试题系列《银行业务调度系统面试题系列.ppt》可能涵盖了设计、开发、测试和运维等相关知识领域。面试问题可能包括但不限于系统架构设计原则,如何处理业务流程中的瓶颈,如何实现高效的数据...

    软件面试题-及参考答案软件面试题-及参考答案软件面试题-及参考答案软件面试题-及参考答案

    本资料包"软件面试题-及参考答案"显然是为帮助应聘者准备软件开发岗位面试而精心编排的。它包含了一个名为"软件面试题_及参考答案.md"的Markdown文件,这类文件通常用于技术文档编写,格式清晰,便于阅读和学习。 ...

    张孝祥 7k面试题 银行业务调度系统改进

    一、系统的取号机只有三种方式的取号(普通客户,快速客户,vip客户),所以采用枚举的方式是比较合适的,因为枚举能产生固定个数的对象,用起来也比较方便。 二、创建普通服务窗口类,下面有两个子类(快速服务...

    银行业务调度系统

    在视频教程“张孝祥-7K月薪面试题破解之二_银行业务调度系统”中,可能会详细讲解如何运用面向对象分析设计方法来构建银行业务调度系统,包括类的定义、接口设计、继承与多态的应用、以及如何利用设计模式解决实际...

    中科大软件学院面试真题-2013最新版

    中科大软件学院的面试题目涵盖了许多计算机科学与技术领域的核心知识点,这些问题不仅考察了考生的理论基础,也检验了其对计算机系统、软件开发和算法设计等实际问题的理解和应用能力。下面将详细介绍部分知识点: ...

    银行业务调度系统源代码

    本视频讲解的内容为《银行业务调度系统》,这道做出来就给7k月薪的面试题。

    oracle,etl工程师--面试题锦集

    - **Oracle Data Integrator (ODI)**:Oracle提供的ETL工具,用于数据整合和迁移,掌握其工作流、映射和调度。 - **Informatica, Talend, SSIS**:其他常见的ETL工具,了解其基本概念和操作。 5. **性能监控与...

    张孝祥银行业务调度系统笔记

    ### 张孝祥银行业务调度系统笔记:面试题解析与设计思路 银行业务调度系统是银行内部用于管理和调度不同类型的客户及其所办理业务的一种高效机制。本笔记将深入解析题目中提到的银行业务调度系统的设计思路,包括...

    银行业务调度系统模拟

    【银行业务调度系统模拟】是一个基于VB编程语言实现的项目,旨在模拟银行内部的业务处理流程,这在软件工程领域中常被用作面试题或毕业设计课题。这个系统的核心目标是有效地管理和优化银行客户的等待及服务过程,...

    操作系统常见面试题总结.pdf

    操作系统是计算机系统的核心组成部分,负责管理和控制系统的硬件和软件资源,提供用户接口和...操作系统面试题涵盖了从基础概念到高级特性的广泛内容,理解并掌握这些知识点对于理解和解决实际操作系统问题至关重要。

    求职-大唐移动笔试题-C语

    在求职过程中,尤其是在应聘软件公司...理解并熟练掌握这些C语言及操作系统的基本概念和编程技巧,对于在软件公司和银行的笔试和面试中取得好成绩至关重要。同时,这些知识也是软件开发人员日常工作中必备的基础能力。

    嵌入式面试题整理 -(linux、c语言、c++、单片机)

    ### 嵌入式面试题知识点总结 #### Linux下的Socket套接字与Windows下的WinSock共同点 1. **基于TCP/IP协议**:无论是Linux下的Socket还是Windows下的WinSock,两者都基于TCP/IP协议栈。这意味着它们都能提供面向...

    Java面试题(最全,最新)

    文件中还提到了关于改进和设计新系统的思考题,如ATM银行自动取款机的设计。在IT行业,系统设计是一项核心技能,它要求设计师不仅要熟悉技术细节,还要具备创新思维,能够从用户需求和业务流程出发,设计出既实用又...

    操作系统试题与答案-操作系统试题与答案

    2. 操作系统的功能:包括进程管理、内存管理、文件管理、设备管理、作业调度、用户接口等。 二、进程管理 1. 进程的概念:进程是程序的一次执行过程,具有独立性、并发性、动态性和异步性。 2. 进程状态:创建、...

    计算机操作系统面试题汇总

    ### 计算机操作系统面试题汇总之核心知识点详解 #### 一、死锁 死锁是一种常见的操作系统问题,尤其在多进程环境中非常关键。当一组进程中的每一个都在等待只有组内的其他进程才能引发的事件时,就会发生死锁。死锁...

    操作系统常见面试题总结.docx

    操作系统面试中常见的问题涵盖了进程与线程、进程状态转换、同步与互斥、进程间通信以及调度算法等多个核心概念。下面将详细解释这些知识点。 **进程与线程的区别** 1. **粒度性分析**:线程是操作系统调度的基本...

Global site tag (gtag.js) - Google Analytics