CSharp设计模式读书笔记(21):状态模式(学习难度:★★★☆☆,使用频率:★★★☆☆)
模式角色与结构:
示例代码:(本示例在具体状态类中实现状态切换,也可以在环境类中实现状态切换。状态模式一定程度上违背开闭原则)
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):状态模式(学习难度:★★★☆☆,使用频率:★★★☆☆)的更多相关文章
- Head First 设计模式读书笔记(1)-策略模式
一.策略模式的定义 策略模式定义了算法族,分别封装起来,让它们之间可以互换替换,此模式让算法的变化独立使用算法的客户. 二.使用策略模式的一个例子 2.1引出问题 某公司做了一套模拟鸭子的游戏:该游戏 ...
- CSharp设计模式读书笔记(24):访问者模式(学习难度:★★★★☆,使用频率:★☆☆☆☆)
模式角色与结构: 示例代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; ...
- CSharp设计模式读书笔记(23):模板方法模式(学习难度:★★☆☆☆,使用频率:★★★☆☆)
模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中.模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模式角色与结构: 实现代码: using System; ...
- CSharp设计模式读书笔记(22):策略模式(学习难度:★☆☆☆☆,使用频率:★★★★☆)
策略模式(Strategy Pattern):定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy). 模式角色与结构: ...
- CSharp设计模式读书笔记(19):备忘录模式(学习难度:★★☆☆☆,使用频率:★★☆☆☆)
备忘录模式(Memento Pattern):在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态.它是一种对象行为型模式,其别名为Tok ...
- CSharp设计模式读书笔记(18):中介者模式(学习难度:★★★☆☆,使用频率:★★☆☆☆)
中介者模式(Mediator Pattern):用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互,中介者模式又称为 ...
- CSharp设计模式读书笔记(17):迭代器模式(学习难度:★★★☆☆,使用频率:★★★★★)
迭代器模式(Iterator Pattern):提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor). 模式角色与结构: 实现代码: using System; us ...
- CSharp设计模式读书笔记(15):命令模式(学习难度:★★★☆☆,使用频率:★★★★☆)
命令模式(Command Pattern):将一个请求封装为一个对象,从而让我们可用不同的请求对客户进行参数化:对请求排队或者记录请求日志,以及支持可撤销的操作.命令模式是一种对象行为型模式,其别名为 ...
- CSharp设计模式读书笔记(14):职责链模式(学习难度:★★★☆☆,使用频率:★★☆☆☆)
职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象 ...
随机推荐
- mysqlbackup 还原特定的表
mysqlbackup使用TTS恢复指定表. ************************************************************* 4.恢复特定表 ******* ...
- VS2015企业版本(安装包+key)
VS2015中文企业版: http://pan.baidu.com/s/1eQtWvNs VS2015英文企业版: http://pan.baidu.com/s/1i3gZaVN —————————— ...
- 【新秀疯狂UML系列】——面向对象的技术
从软质工作开始,我们来到与面向对象的接触,接下来的学习材料似乎已经提到了面向对象,在与她的朋友去一个.所以,我们必须知道她多一点点. 一.何为面向对象? 面向对象(Object Oriented).是 ...
- * 类描写叙述:字符串工具类 类名称:String_U
/****************************************** * 类描写叙述:字符串工具类 类名称:String_U * ************************** ...
- MapReduce 规划 六系列 MultipleOutputs采用
在前面的示例,输出文件名是默认: _logs part-r-00001 part-r-00003 part-r-00005 part-r-00007 part-r-00009 part-r-00011 ...
- c++日历v1.0版本
#include<iostream> # include<fstream> #include<time.h> #include<string> #inc ...
- [three.js] 地图不能解决重复的问题 Solving with Texture RepeatWrapping Fail Issue
有些事情,如果你正在寻找侯,怎么也找不到. 有的东西,不经意间,到处: 我认为这是生活中常有的事. 然而,在互联网的浩瀚大海,这同样适用. 正常的一小会儿的积累, 投入少, 积累, 洋大海, 载起一帆 ...
- hibernate它 11.many2many双向
表结构: 类图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd29iZW5kaWFua3Vu/font/5a6L5L2T/fontsize/400/fi ...
- linux软与硬接线连接
1.Linux链接概念 Linux链接分两种.一种被称为硬链接(Hard Link),还有一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接. [硬连接] 硬连接指通过索 ...
- bsh for android : 北京
beanshell : bjtime.bsh source("/sdcard/com.googlecode.bshforandroid/extras/bsh/android.bsh" ...