模式角色与结构:

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

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. DSR on Openstack POC

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWFvbGlwaW5nNDU1bWxwNDU1/font/5a6L5L2T/fontsize/400/fil ...

  2. [LeetCode62]Unique Paths

    题目: A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). ...

  3. Java中Integer类的方法

    java.lang 类 Integer java.lang.Object java.lang.Number java.lang.Integer 全部已实现的接口: Serializable, Comp ...

  4. JavaScript IDE

    哪些JavaScript IDE最好用?   阅读本文之前,分享大家一张图片,看图会发现JavaScript开发需求最高,占比达到42.84%,因此掌握JavaScript语言好工作就不愁啦,工欲善其 ...

  5. 玩转Web之JavaScript(一)-----javaScript语法总结(一) 与鼠标操作有关的语法

    click()  对象.click()  使对象被点击. event.clientX  返回最后一次点击鼠标 X 坐标值: event.clientY  返回最后一次点击鼠标 Y 坐标值: event ...

  6. Twitter 新一代流处理工具——Heron 该纸币Storm Limitations

    Twitter 新一代流处理工具--Heron 该纸币Storm Limitations (空格分隔): Streaming-Processing Storm Problems scalability ...

  7. StackExchange.Redis 使用 - 事件(五)

    ConnectionMultiplexer 可以注册如下事件 ConfigurationChanged - 配置更改时 ConfigurationChangedBroadcast - 通过发布订阅更新 ...

  8. Android属于查询执行情况的电话号码

    这部分是昨天学习,但是因为眼所以现在到眼睛超负荷,以后要合理规划时间. 现在里面的手机号码归属地查询主要通过两种途径:1.网络查询.2.匹配本地归属地数据库. 我认为最好的两个方法的结合,在进行联网查 ...

  9. Java IO的RandomAccessFile的使用(转)

    现有如下的一个需求,向已存在1G数据的txt文本里末尾追加一行文字,内容如下“Lucene是一款非常优秀的全文检索库”.可能大多数朋友会觉得这个需求很easy,说实话,确实easy,然后XXX君开始实 ...

  10. 致网友Wonderfei的一封信(怎样选择自己主动化框架的几点拙见)

    注:本来这封信要发给Wonerfei网友的,可是由于每次仅仅能发200字,所以干脆贴到博客上,叫Wonderfei同学到这上面来看,也算是我自己的一个暂时总结吧.同一时候也希望大家给予Wonderfe ...