模式角色与结构:

示例代码:(本示例在具体状态类中实现状态切换,也可以在环境类中实现状态切换。状态模式一定程度上违背开闭原则)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace CSharp.DesignPattern.StatePattern
{
class Program
{
static void Main(string[] args)
{
Account account = new Account(0.0);
account.Deposit(); //
account.Withdraw(); // -1000
account.Deposit(); //
account.Withdraw(); // -2000
account.Withdraw(); // -3000
account.ComputeInterest();
Console.ReadLine();
}
} // 环境类
class Account
{
public Account(double balance)
{
this._balance = balance;
this._state = new NormalState(this);
} public void Deposit(double amount)
{
_state.Deposit(amount);
} public void Withdraw(double amount)
{
_state.Withdraw(amount);
} public void ComputeInterest()
{
_state.ComputeInterest();
} public double Balance
{
get { return _balance; }
set { _balance = value; }
}
internal AccountState State
{
get { return _state; }
set { _state = value; }
} private double _balance = ;
private AccountState _state;
} // 抽象状态类
abstract class AccountState
{
protected Account _account; public virtual void Deposit(double amount)
{
_account.Balance += amount;
StateCheck();
}
public virtual void Withdraw(double amount)
{
_account.Balance -= amount;
StateCheck();
}
public abstract void ComputeInterest();
public abstract void StateCheck();
} // 具体状态类
class NormalState : AccountState
{
public NormalState(Account account)
{
this._account = account;
} public override void ComputeInterest()
{
Console.WriteLine("No interest...");
}
// 状态转换
public override void StateCheck()
{
if (_account.Balance > - && _account.Balance <= )
{
_account.State = new OverdraftState(this._account);
Console.WriteLine("OverdraftState...");
}
else if (_account.Balance == -)
{
_account.State = new RestrictedState(this._account);
Console.WriteLine("RestrictedState...");
}
else if (_account.Balance < -)
{
Console.WriteLine("Forbidden...");
}
}
} // 具体状态类
class OverdraftState : AccountState
{
public OverdraftState(Account account)
{
this._account = account;
} public override void ComputeInterest()
{
Console.WriteLine("Compute interest...");
}
// 状态转换
public override void StateCheck()
{
if (_account.Balance > )
{
_account.State = new NormalState(this._account);
Console.WriteLine("NormalState...");
}
else if (_account.Balance == -)
{
_account.State = new RestrictedState(this._account);
Console.WriteLine("RestrictedState...");
}
else if (_account.Balance < -)
{
Console.WriteLine("Forbidden...");
}
}
} // 具体状态类
class RestrictedState : AccountState
{
public RestrictedState(Account account)
{
this._account = account;
} public override void Withdraw(double amount)
{
Console.WriteLine("Account is restricted, withdraw failed...");
} public override void ComputeInterest()
{
Console.WriteLine("Compute interest...");
}
// 状态转换
public override void StateCheck()
{
if (_account.Balance > )
{
_account.State = new NormalState(this._account);
Console.WriteLine("NormalState...");
}
else if (_account.Balance > -)
{
_account.State = new OverdraftState(this._account);
Console.WriteLine("OverdraftState...");
}
}
}
}

CSharp设计模式读书笔记(21):状态模式(学习难度:★★★☆☆,使用频率:★★★☆☆)的更多相关文章

  1. Head First 设计模式读书笔记(1)-策略模式

    一.策略模式的定义 策略模式定义了算法族,分别封装起来,让它们之间可以互换替换,此模式让算法的变化独立使用算法的客户. 二.使用策略模式的一个例子 2.1引出问题 某公司做了一套模拟鸭子的游戏:该游戏 ...

  2. CSharp设计模式读书笔记(24):访问者模式(学习难度:★★★★☆,使用频率:★☆☆☆☆)

    模式角色与结构: 示例代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  3. CSharp设计模式读书笔记(23):模板方法模式(学习难度:★★☆☆☆,使用频率:★★★☆☆)

    模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中.模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模式角色与结构: 实现代码: using System; ...

  4. CSharp设计模式读书笔记(22):策略模式(学习难度:★☆☆☆☆,使用频率:★★★★☆)

    策略模式(Strategy Pattern):定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy). 模式角色与结构: ...

  5. CSharp设计模式读书笔记(19):备忘录模式(学习难度:★★☆☆☆,使用频率:★★☆☆☆)

    备忘录模式(Memento Pattern):在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态.它是一种对象行为型模式,其别名为Tok ...

  6. CSharp设计模式读书笔记(18):中介者模式(学习难度:★★★☆☆,使用频率:★★☆☆☆)

    中介者模式(Mediator Pattern):用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互,中介者模式又称为 ...

  7. CSharp设计模式读书笔记(17):迭代器模式(学习难度:★★★☆☆,使用频率:★★★★★)

    迭代器模式(Iterator Pattern):提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor). 模式角色与结构: 实现代码: using System; us ...

  8. CSharp设计模式读书笔记(15):命令模式(学习难度:★★★☆☆,使用频率:★★★★☆)

    命令模式(Command Pattern):将一个请求封装为一个对象,从而让我们可用不同的请求对客户进行参数化:对请求排队或者记录请求日志,以及支持可撤销的操作.命令模式是一种对象行为型模式,其别名为 ...

  9. CSharp设计模式读书笔记(14):职责链模式(学习难度:★★★☆☆,使用频率:★★☆☆☆)

    职责链模式(Chain of Responsibility  Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象 ...

随机推荐

  1. Windows8.1和Ubuntu14.04双系统卸载Ubuntu參考教程[图]

    我之前编写并公布了<Windows8.1安装Ubuntu14.04双系统參考教程及双硬盘注意事项>这篇教程,而本文提供的卸载Ubuntu方法适用于这篇教程,其它方法安装的Ubuntu可适当 ...

  2. hdu3790最短路径问题

    题意是这种,给你一个无向图, 每条边有距离和花费, 假设从第一个点到末点的最短路不唯一, 则输出最短路长度以及最少的花费. 否则输出长度和花费即可. 用传说中的链式向前星优化了一下边的存储, 写了个s ...

  3. android得知----overridePendingTransition

    1 Activity动画是指从一个切换activity跳到另一个activity随着电影. 它由两部分组成:第一部分是一个activity动画出口:中的第二个另一部分activity动画被访问: 于A ...

  4. 开源Math.NET基础数学类库使用(12)C#随机数扩展方法

    原文:[原创]开源Math.NET基础数学类库使用(12)C#随机数扩展方法                本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p ...

  5. Windows 2008 R2安装.NET Framework 4提示灾难性故障解决方法

    原因:WINDOWS 2008的安全设置方案取消了C盘根目录的Users权限,只给administrator和system权限,结果在打补丁时就无法更新(安装.net4需要安装windows6.1-K ...

  6. Windows Phone 同步方式获取网络类型

    原文:Windows Phone 同步方式获取网络类型 在Windows Phone 开发中有时候需要获取设备当前连接网络的类型,是Wifi,还是2G,3G,或者4G,SDK中提供获取网络类型的API ...

  7. 【转】tomcat 访问软连接文件夹下的网页出现404错误,description The requested resource (/xxx.html) is not available.

    在 tomcat/webapps/ROOT/ 下建立一个软连接文件ln -s /home/ubuntu/report report   再到report软连接目录里建立个 report.html通过浏 ...

  8. Oracle listener lsnrctl

    lsnrctl(Listener Control)是一家SQL*Net具,用于控制数据库listener,此工具提供了控制命令listener开端.停止,查看listener状态,更改listener ...

  9. 第三篇——第二部分——第四文 配置SQL Server镜像——非域环境

    原文:第三篇--第二部分--第四文 配置SQL Server镜像--非域环境 本文为非域环境搭建镜像演示,对于域环境搭建,可参照上文:http://blog.csdn.net/dba_huangzj/ ...

  10. sqlserver system object type

    select distinct s.type, s.type_desc from sys.objects as s inner join (select distinct type from sys. ...