黑马程序员_银行业务调度系统

本文介绍了一个银行排队系统的模拟实现,包括面向对象的设计思路与具体的Java程序实现细节。系统支持VIP客户、普通客户和快速客户三种类型,通过号码管理器和单例模式的号码类型机来实现不同类型的客户在相应窗口有序地办理业务。
 

-------------------------------------------------android培训java培训期待与您交流!----------------------------------

一、面向对象的分析与设计

1.有三种对应类型的客户:VIP客户,普通客户,快速客户 ,异步随机生成各种类型的客户,各类型客户在其对应窗口按顺序依次办理业务 。

1)每一个客户其实就是由银行的一个取号机器产生号码的方式来表示的,要有一个号码管理器对象,让这个对象不断地产生号码,就等于随机生成了客户。

2)由于有三类客户,每类客户的号码编排都是完全独立的,所以,我想到本系统一共要产生三个号码管理器对象,各自管理一类用户的排队号码。这三个号码管理器对象统一由一个号码机器进行管理,这个号码机器在整个系统中始终只能有一个,所以,它要被设计成单例。

2.各类型客户在其对应窗口按顺序依次办理业务 ,准确地说,应该是窗口依次叫号。

1)各个窗口怎么知道该叫哪一个号了呢?它一定是问的相应的号码管理器,即服务窗口每次找号码管理器获取当前要被服务的号码。

二、程序实现

1.NumberManager号码管理类

public class NumberManager {

    private List<Integer> numbers=new ArrayList<Integer>();

    private int number=1;

    //生成号码,synchronized多线程安全访问,同步

    public synchronized Integer generateNewNumber() {

        numbers.add(number);

        return number++;

    }

    //依次取走号码

    public synchronized Integer fetchNumber() {

        if(numbers.size()>0)

            return numbers.remove(0);

        return null;

    }

}

2.NumberMachine号码类型机类

public class NumberMachine {

    private NumberManager commonMachine=new NumberManager();

    private NumberManager expressMachine=new NumberManager();

    private NumberManager vipMachine=new NumberManager();

   

   

    public NumberManager getCommonMachine() {

        return commonMachine;

    }

    public NumberManager getExpressMachine() {

        return expressMachine;

    }

    public NumberManager getVipMachine() {

        return vipMachine;

    }

//单例

    private static NumberMachine numberMachine=new NumberMachine();

    private NumberMachine() {}

    public static NumberMachine getInstance()

    {

        return numberMachine;

    }

}

3.Constants常量类

public interface Constants {

    int MAX_WAIT_TIME=10;//最大等待时间

    int MIN_WAIT_TIME=1;//最小等待时间

    int COMMON_CUSTOMER_INTERVAL_TIME=1;//普通用户回调时间

}

4.CustomerType用户类型

public enum CustomerType {

    COMMON,EXPRESS,VIP;

    public String toString() {

        switch (this) {

        case COMMON:

            return "普通";

        case EXPRESS:

            return "快速";

        case VIP:

            return name();

        }

        return null;

    }

}

5.ServiceWindow窗口类

public class ServiceWindow {

    private int windowId;

    private CustomerType windowType;

    public void setWindowId(int windowId) {

        this.windowId = windowId;

    }

    public void setWindowType(CustomerType windowType) {

        this.windowType = windowType;

    }

    //各类型窗口开始服务

    public void start()

    {

        Executors.newSingleThreadExecutor().execute(new Runnable() {

            @Override

            public void run() {

                switch(windowType)

                {

                case COMMON:

                    while(true)

                        commonService();

                case EXPRESS:

                    while(true)

                        expressService();

                case VIP:

                    while(true)

                        vipService();

                }

            }

        });

    }

    public void commonService() {

        Integer num=NumberMachine.getInstance().getCommonMachine().fetchNumber();

        System.out.println(windowId+"号"+windowType+"窗口等待服务-----");

        if(null!=num)

        {

            System.out.println(windowId+"号"+windowType+"窗口正在为"+num+"号普通客户服务");

            int ranNum=new Random().nextInt(Constants.MAX_WAIT_TIME)+Constants.MIN_WAIT_TIME;

            try {

                Thread.sleep(ranNum*1000);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

            System.out.println(windowId+"号"+windowType+"窗口为"+num+"号普通客户服务完成,耗"+ranNum+"秒");

        }

        else

        {

            System.out.println(windowId+"号"+windowType+"窗口没有要服务的客户,休闲一秒");

            try {

                Thread.sleep(1000);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

        }

    }

    public void expressService() {

        Integer num=NumberMachine.getInstance().getExpressMachine().fetchNumber();

        System.out.println(windowId+"号"+windowType+"窗口等待服务-----");

        if(null!=num)

        {

            System.out.println(windowId+"号"+windowType+"窗口正在为"+num+"号"+windowType+"客户服务");

            try {

                Thread.sleep(1000);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

            System.out.println(windowId+"号"+windowType+"窗口为"+num+"号"+windowType+"客户服务完成,耗1秒");

        }

        else

        {

            System.out.println(windowId+"号"+windowType+"窗口没有要服务的客户,转向为普通客户服务<--");

            commonService();

        }

    }

    public void vipService() {

        Integer num=NumberMachine.getInstance().getVipMachine().fetchNumber();

        System.out.println(windowId+"号"+windowType+"窗口等待服务-----");

        if(null!=num)

        {

            System.out.println(windowId+"号"+windowType+"窗口正在为"+num+"号"+windowType+"客户服务");

            int ranNum=new Random().nextInt(Constants.MAX_WAIT_TIME)+Constants.MIN_WAIT_TIME;

            try {

                Thread.sleep(ranNum*1000);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

            System.out.println(windowId+"号"+windowType+"窗口为"+num+"号普通客户服务完成,耗"+ranNum+"秒");

        }

        else

        {

            System.out.println(windowId+"号"+windowType+"窗口没有要服务的客户,转向为普通客户服务<--");

            commonService();

        }

    }

}

6.Test 测试类

public class Test {

    public static void main(String[] args) {

        ServiceWindow commonWindow=null;

        //四个普通窗口

        for(int i=1;i<5;i++)

        {

            commonWindow=new ServiceWindow();

            commonWindow.setWindowId(i);

            commonWindow.setWindowType(CustomerType.COMMON);

            commonWindow.start();

        }

        //一个快速窗口

        ServiceWindow expressWindow=new ServiceWindow();

        expressWindow.setWindowId(6);

        expressWindow.setWindowType(CustomerType.EXPRESS);

        expressWindow.start();

        //一个vip窗口

        ServiceWindow vipWindow=new ServiceWindow();

        vipWindow.setWindowId(7);

        vipWindow.setWindowType(CustomerType.VIP);

        vipWindow.start();

        //加入普通客户

        Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {

            @Override

            public void run() {

                Integer commonId=NumberMachine.getInstance().getCommonMachine().generateNewNumber();

                System.out.println(commonId+"号普通客户等待服务******");

            }

        }, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME, TimeUnit.SECONDS);

        //加入快速客户

        Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {

            @Override

            public void run() {

                Integer expressId=NumberMachine.getInstance().getExpressMachine().generateNewNumber();

                System.out.println(expressId+"号快速客户等待服务******");

            }

        }, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME*2, TimeUnit.SECONDS);

        //加入vip客户

        Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {

            @Override

            public void run() {

                Integer vipId=NumberMachine.getInstance().getVipMachine().generateNewNumber();

                System.out.println(vipId+"号vip客户等待服务******");

            }

        }, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME*6, TimeUnit.SECONDS);

    }

}

 

-------------------------------------------------android培训java培训期待与您交流!----------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值