Реализуйте лучший шаблон стратегии - PullRequest
2 голосов
/ 25 октября 2010

У меня есть счет Chequing и сберегательный счет. Я изучаю, как реализовать метод вывода, используя шаблон стратегии.

В настоящее время чековая и сберегательная учетная запись наследуются от учетной записи. Для Сберегательного счета, снятие средств не должно приводить к падению баланса ниже 100 долларов. При использовании учетной записи Chequing для снятия средств необходимо указать номер чека.

Я не уверен в использовании этого подхода, потому что, как вы увидите ниже, параметр "otherArguments" совершенно бесполезен в одном сценарии. И единственная причина, по которой у меня это так, - «показать» использование шаблона стратегии.

(для тех, кто заинтересован, это часть школьного проекта, весь код ниже я написал, и мне интересно, есть ли лучший способ сделать это).

Вот что я сделал до сих пор:

public abstract class Account
{
    public double Balance{get; set;}

    public WithdrawStrategy Withdrawer
    {
        get; set;
    }


    public abstract void withdraw(double currentBalance, double amount, object otherArguments);
}

public class Chequing: Account
{
    public Chequing()
    {
        Withdrawer= new ChequingAccountWithdrawer();
    }


    public override void withdraw(double currentBalance, double amount, object otherArguments)
    {
        if (null != Withdrawer)
        {
            double balance = Withdrawer.withdraw(currentBalance, amount, otherArguments);
            Balance = balance;
        }
    }    
}

public class Saving: Account
{
    public Saving()
    {
        Withdrawer= new SavingAccountWithdrawer();
    }


    public override void withdraw(double currentBalance, double amount, object otherArguments)
    {
        if (null != Withdrawer)
        {
            double balance = Withdrawer.withdraw(currentBalance, amount, otherArguments);
            Balance = balance;
        }
    }    
}

public interface WithdrawStrategy
{
    double withdraw(double currentBalance, double amount, object otherArguments);
}

public ChequingAccountWithdrawer: WithdrawStrategy
{
    public double withdraw(double currentBalance, double amount, object otherArguments)
    {
        string cheqNum = otherArguments.ToString();
        if (!string.IsNullOrEmpty(cheqNum))
        {
            currentBalance -= amount;
        }
        return currentBalance;
    }
}

public SavingAccountWithdrawer: WithdrawStrategy
{
    public double withdraw(double currentBalance, double amount, object otherArguments)
    {
        if (currentBalance - amount > 100) //hard code for example's sake
        {
            currentBalance -= amount;
        }
        return currentBalance;
    }
}

1 Ответ

1 голос
/ 25 октября 2010

При использовании шаблона «Стратегия» вам может потребоваться предоставить информацию, которая фактически бесполезна.Это одно из негативных последствий.Другое решение - передать необходимую информацию в объект Strategy через конструктор.Это гарантирует, что объект «Стратегия» имеет минимальный объем информации, который ему требуется.

Лучшим решением может быть метод шаблона, хотя, если минимум 100 является единственным алгоритмическим отличием.

Вот пример кода.

public abstract class Account
{
    public double Balance{get; set;}
    public abstract void withdraw();
}

public class Chequing: Account
{
    public override void withdraw()
    {
        //It's not clear where the values for your constructor come from, but
        //you get the idea.
        WithdrawStrategy withdrawer= new ChequingAccountWithdrawer();
        /////////////////////////////////////////////////////////////
        double balance = Withdrawer.withdraw();
        Balance = balance;
    }    
}

public class Saving: Account
{
    public override void withdraw()
    {
        //Same idea here.
        WithdrawStrategy withdrawer= new SavingAccountWithdrawer();
        /////////////////////////////////////////////////////////////
        double balance = Withdrawer.withdraw();
        Balance = balance;
    }    
}

public interface WithdrawStrategy
{
    double withdraw();
}

public ChequingAccountWithdrawer: WithdrawStrategy
{
    private readonly int balance;
    private readonly double amount;
    private readonly string number;

    public ChequingAccountWithdrawer(double aBalance, double aAmount, string aNumber) {
        balance = aBalance
        amount = aAmount
        number = aNumber
    }

    public double withdraw()
    {
        if (number)
        {
            currentBalance -= amount;
        }

        return currentBalance;
    }
}

public SavingAccountWithdrawer: WithdrawStrategy
{
    private readonly int balance;
    private readonly double amount;

    public SavingAccountWithdrawer(double aBalance, double aAmount) {
        balance = aBalance
        amount = aAmount
    }

    public double withdraw()
    {
        if (currentBalance - amount > 100) //hard code for example's sake
        {
            currentBalance -= amount;
        }

        return currentBalance;
    }
}

Есть некоторое дублирование кода,Так как это домашнее задание, вы не можете многое сделать.Хотя, если бы это был мой звонок, я бы сразу абстрагировал эти поля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...