У меня есть программа банковского счета. Каждая учетная запись может находиться в состоянии начального состояния или доверенной учетной записи (в настоящее время). В будущем могут быть добавлены новые государства. Проценты не выплачиваются, если они находятся в исходном состоянии. Но 9% процентов выплачивается, если он находится в состоянии доверенной учетной записи.Уменьшение сцепления в шаблоне состояния
Следующий код работает. Но в методе ChangeState() существует жесткая связь. InitialAccountState
должен знать о существовании TrustedAccountedState
.. И если мы добавим новое состояние с именем VeteranAccountedState
, метод ChangeState() необходимо переписать в классе InitialAccountState
.
Каков наилучший способ .Net 4.0 уменьшить эту муфту?
государственного образца
Паттерн состояние позволяет состояние объект, чтобы изменить в любой момент, который на самом деле изменяет свое поведение .
Сцепление не является проблемой в шаблоне состояния, когда задан порядок изменения состояний. Например, светофор всегда будет меняться от зеленого-желтого-красного. В этом случае соединение не является проблемой - зеленый уверен, что в следующем шаге он всегда будет желтым. См Analysis Of State Machine Pattern
РЕФЕРАТ Государственный
abstract class AccountState
{
// Properties
public BankAccount Account { get; set; }
public double Balance { get; set; }
protected double interest;
protected double lowerLimit;
protected double upperLimit;
public abstract void Deposit(double amount);
public abstract void PayInterest();
}
БЕТОН
class InitialAccountState : AccountState
{
public InitialAccountState(AccountState state) :this(state.Balance, state.Account)
{
}
public InitialAccountState(double balance, BankAccount account)
{
this.Balance = balance;
this.Account = account;
Initialize();
}
private void Initialize()
{
lowerLimit = 0.0;
upperLimit = 1000.0;
}
public override void Deposit(double amount)
{
Balance += amount;
ChangeState();
}
public override void PayInterest()
{
throw new Exception("No Interest Allowed");
}
private void ChangeState()
{
if (Balance > upperLimit)
{
Account.State = new TrustedAccountedState(this);
}
}
}
class TrustedAccountedState : AccountState
{
public TrustedAccountedState(AccountState state): this(state.Balance, state.Account)
{
}
public TrustedAccountedState(double balance, BankAccount account)
{
this.Balance = balance;
this.Account = account;
Initialize();
}
private void Initialize()
{
interest = 0.05;
lowerLimit = 1000.0;
upperLimit = 10000000.0;
}
public override void Deposit(double amount)
{
Balance += amount;
ChangeState();
}
public override void PayInterest()
{
Balance += interest * Balance;
ChangeState();
}
private void ChangeState()
{
if (Balance < lowerLimit)
{
Account.State = new InitialAccountState(this);
}
}
}
КОНТЕКСТ
class BankAccount
{
// Properties
public AccountState State { get; set; }
public double Balance
{
get { return State.Balance; }
}
// Constructor
public BankAccount(string owner)
{
this.State = new InitialAccountState(0.0, this);
}
public void Deposit(double amount)
{
State.Deposit(amount);
Console.WriteLine("Deposited {0:C} --- ", amount);
Console.WriteLine(" Balance = {0:C}", this.Balance);
Console.WriteLine(" Status = {0}", this.State.GetType().Name);
Console.WriteLine("");
}
public void PayInterest()
{
State.PayInterest();
Console.WriteLine("INTEREST PAID --- ");
Console.WriteLine(" Balance = {0:C}", this.Balance);
Console.WriteLine(" Status = {0}\n", this.State.GetType().Name);
}
}
КЛИЕНТ
class Program
{
static void Main(string[] args)
{
BankAccount account = new BankAccount("Jim Johnson");
account.Deposit(500.0);
account.Deposit(300.0);
account.Deposit(550.0);
account.PayInterest();
Console.ReadKey();
}
}
ЛИТЕРАТУРА
- Analysis Of State Machine Pattern
- Is the State Design pattern scalable ?
- State Design Pattern
- Implementing the Specification Pattern in .NET
- Is the Specification Pattern obsolete?
- Specification pattern in C#
- Specifications in C# 3.0
- LINQ Expression Trees and the Specification Pattern
Возможно, вы захотите рассмотреть шаблон спецификации: http://en.wikipedia.org/wiki/Specification_pattern –