使用状态设计模式设计ATM机

时间:2020-01-02 11:24:27

标签: c# oop design-patterns c#-4.0 object-oriented-analysis

最近,我遇到了一个问题,即使用状态设计模式设计ATM机,我是设计模式的新手,但不知何故,我已经完成了该问题并使用以下方法设计了ATM机C#中的状态设计模式。

因此,我只想告诉我这个程序是否可以进行任何优化,或者可以接受此解决方案。当前的解决方案正在运行,没有任何错误。

控制ATM机状态的客户端类。

public class Client
{
    public static void Main(string [] args)
    {
        AtmMachine atmMachine = new AtmMachine();

        atmMachine.enterPinAndWithdrawMoney();
        atmMachine.ejectDebitCard();
        atmMachine.insertDebitCardState();

        atmMachine.enterPinAndWithdrawMoney();
        atmMachine.insertDebitCardState();
        atmMachine.ejectDebitCard();      

        Console.ReadLine();
    }
}

ATM机器类

public class AtmMachine : IAtmMachineState
{
    private IAtmMachineState _state;
    public int _balance = 5000;
    public int _pin = 1234;
    public AtmMachine()
    {
        _state = new NoDebitCardState();
    }

    public IAtmMachineState GetMachineState()
    {
        return _state;
    }

    public void setAtmMachineState(IAtmMachineState state)
    {
        this._state = state;
    }

    public void ejectDebitCard()
    {
        _state.ejectDebitCard();        

        if(_state is HasDebitCardState)
        {
            _state = new NoDebitCardState();
            Console.WriteLine("State Changed");
            Console.WriteLine(_state.GetType().Name);
        }

    }

    public void enterPinAndWithdrawMoney()
    {       

        if(_state is HasDebitCardState)
        {
            _state.enterPinAndWithdrawMoney();
        }
    }

    public void insertDebitCardState()
    {        

        if(_state is NoDebitCardState)
        {
            _state = new HasDebitCardState();
            Console.WriteLine("State Changed");
            Console.WriteLine(_state.GetType().Name);
        }
    }
}

ATM机器接口

public interface IAtmMachineState
{
    void insertDebitCardState();
    void ejectDebitCard();
    void enterPinAndWithdrawMoney();

}

具有借记卡状态

class HasDebitCardState : IAtmMachineState
{
    AtmMachine atmMachine;
    public HasDebitCardState()
    {
        atmMachine = new AtmMachine();
    }
    public void ejectDebitCard()
    {
        Console.WriteLine("Debit card ejected successfully");
    }

    public void enterPinAndWithdrawMoney()
    {
        Console.WriteLine("Enter the Pin:");
        int pin = int.Parse(Console.ReadLine());
        if(atmMachine._pin==pin) 
        {
            Console.WriteLine("Enter the amount");
            int amount = int.Parse(Console.ReadLine());
            if(amount > atmMachine._balance) 
            {
                Console.WriteLine("Money can not be withdrawn because of low balance");
            }
            else
            {
                atmMachine._balance = atmMachine._balance - amount;
                Console.WriteLine("Please collect your cash");
                Console.WriteLine("Remaining Balance {0}", atmMachine._balance);
            }
        } else
        {
            Console.WriteLine("Incorrect Pin.");
        }
    }

    public void insertDebitCardState()
    {
        Console.WriteLine("Debit card is already there, so can not insert debit card");
    }
}

无借记卡状态

class NoDebitCardState : IAtmMachineState
{

    public void ejectDebitCard()
    {
        Console.WriteLine("No debit card inside atm");
    }

    public void enterPinAndWithdrawMoney()
    {
        Console.WriteLine("No debit card in ATM Machine, so you can not withdraw money");
    }

    public void insertDebitCardState()
    {
        Console.WriteLine("Debit Card Inserted");
    }
}

1 个答案:

答案 0 :(得分:2)

  1. 您可能要考虑使用抽象类而不是接口。

  2. 除了抽象类,您还可以使用默认实现,但这将限制您像在抽象类中那样使用预定义的成员和状态。

这样,您可以具有一些标准功能,并且避免多次重写同一代码。

仅覆盖按状态更改的功能。

您还可以通过调用抽象类的基本实现以及每个状态中的额外逻辑来轻松扩展。