状态模式
1. 概述
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
2. 解决的问题
主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。
3.类图

4.代码展示
Account
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 状态模式作业
{
public class Account
{
public AccountState State { set; get; }
public string Owner { set; get; }
public double Balance { set; get; }
public Account(string owner, double initialAmount)
{
Owner = owner;
Balance = initialAmount;
State = new VistorState(this);
}
public void SetBalance(double amount)
{
Balance = amount;
}
public void Deposit(double amount)
{
Console.WriteLine("存入" + amount);
State.Deposit(amount);
}
public void Shopping(double amount)
{
Console.WriteLine("消费" + amount);
State.Shopping(amount);
}
}
AccountState
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 状态模式作业
{
public abstract class AccountState
{
protected Account _account;
public abstract void Deposit(double amount);
public abstract void Shopping(double amount);
public abstract void StateCheck();
}
}
Program
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 状态模式作业
{
class Program
{
static void Main(string[] args)
{
Account account = new Account("嘉峪关", 34599);
Console.WriteLine("开户成功。姓名:" + account.Owner + " 初始金额:" + account.Balance );
Console.WriteLine("----------------------------");
account.Deposit(56);
Console.WriteLine("-----------------------------");
}
}
}
VistorState
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 状态模式作业
{
public class VistorState:AccountState
{
public VistorState(Account account)
{
_account = account;
StateCheck();
}
public override void Deposit(double amount)
{
_account.Balance += amount;
Console.WriteLine( amount + "元,存款后的账户余额为:" + _account.Balance);
StateCheck();
}
public override void Shopping(double amount)
{
double newBalance = _account.Balance - amount;
if (newBalance > 0)
{
_account.Balance -= amount;
Console.WriteLine( amount + "元,账户余额:" + _account.Balance);
}
StateCheck();
}
public override void StateCheck()
{
if (_account.Balance > 100 && _account.Balance < 1000)
{
_account.State = new MemberState(_account);
}
else if (_account.Balance > 1000)
{
_account.State = new VIPState(_account);
}
}
}
public class VIPState : AccountState
{
public VIPState(Account account)
{
_account = account;
}
public override void Deposit(double amount)
{
_account.Balance += amount;
Console.WriteLine(amount + "元,存款后的账户余额为:" + _account.Balance);
StateCheck();
}
public override void Shopping(double amount)
{
double newBalance = _account.Balance - amount;
if (newBalance > 0)
{
_account.Balance -= amount;
Console.WriteLine(amount + "元,账户余额:" + _account.Balance);
}
StateCheck();
}
public override void StateCheck()
{
if (_account.Balance > 0 && _account.Balance < 100)
{
_account.State = new VistorState(_account);
}
else if (_account.Balance > 100 && _account.Balance < 1000)
{
_account.State = new MemberState(_account);
}
}
}
public class MemberState : AccountState
{
public MemberState(Account account)
{
_account = account;
}
public override void Deposit(double amount)
{
_account.Balance += amount;
Console.WriteLine(amount + "元,存款后的账户余额为:" + _account.Balance);
StateCheck();
}
public override void Shopping(double amount)
{
double newBalance = _account.Balance - amount;
if (newBalance > 0)
{
_account.Balance -= amount;
Console.WriteLine(amount + "元,账户余额:" + _account.Balance);
}
StateCheck();
}
public override void StateCheck()
{
if (_account.Balance > 0 && _account.Balance < 100)
{
_account.State = new VistorState(_account);
}
else if (_account.Balance > 1000)
{
_account.State = new VIPState(_account);
}
}
}
}
浙公网安备 33010602011771号