惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

NISL@THU
NISL@THU
Security Archives - TechRepublic
Security Archives - TechRepublic
T
Threatpost
Cloudbric
Cloudbric
H
Heimdal Security Blog
P
Privacy International News Feed
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Tor Project blog
A
Arctic Wolf
W
WeLiveSecurity
SecWiki News
SecWiki News
S
Security Affairs
Schneier on Security
Schneier on Security
PCI Perspectives
PCI Perspectives
Simon Willison's Weblog
Simon Willison's Weblog
K
Kaspersky official blog
P
Privacy & Cybersecurity Law Blog
AWS News Blog
AWS News Blog
T
The Exploit Database - CXSecurity.com
V2EX - 技术
V2EX - 技术
AI
AI
Google DeepMind News
Google DeepMind News
Stack Overflow Blog
Stack Overflow Blog
博客园 - 司徒正美
有赞技术团队
有赞技术团队
C
Cybersecurity and Infrastructure Security Agency CISA
腾讯CDC
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 聂微东
H
Hacker News: Front Page
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Hugging Face - Blog
Hugging Face - Blog
The Hacker News
The Hacker News
阮一峰的网络日志
阮一峰的网络日志
Microsoft Security Blog
Microsoft Security Blog
WordPress大学
WordPress大学
月光博客
月光博客
博客园 - 【当耐特】
Recorded Future
Recorded Future
O
OpenAI News
Hacker News: Ask HN
Hacker News: Ask HN
Scott Helme
Scott Helme
N
News and Events Feed by Topic
Help Net Security
Help Net Security
GbyAI
GbyAI
Google DeepMind News
Google DeepMind News
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Y
Y Combinator Blog
Martin Fowler
Martin Fowler
小众软件
小众软件

博客园 - 戴玮

实在是忍受不了MSN的巨慢速度,重新换个地方 如果在网页中实现查找功能 asp.net2.0 页面生命周期方法 C#加密与解决 如何自定义一个模板列,并在后台加载 ASP.NET常用的代码集合 - 戴玮 - 博客园 触发器示例代码 ADO.NET2.0分页 - 戴玮 - 博客园 如何查找 Office Web 组件 (OWC) 编程文档和示例 如何将枚举定义翻译成DataTable 网页中调用MSN添加好友工具 如何在XP SP2下面使用DTC Javascript 复制与粘贴 - 戴玮 - 博客园 如何在Component中取得Page对象 使用TransactionScope进行COM+事务处理 - 戴玮 - 博客园 如何在C#中使用EVAL方法 - 戴玮 - 博客园 巨NB的JAVASCRIPT代码 - 戴玮 - 博客园 9月25日C#->WebService中如何传递文件 解决了一年多的问题,狂喜(一年之前)
关于状态模式的思考
戴玮 · 2006-12-10 · via 博客园 - 戴玮

今天是星期天,照着深入浅出设计模式中的状态模式,有如下心得:

发现,状态模式它的应用范围是解决一个对象的状态问题(并且这个状态的主体的状态是循环变化的,可以由A变成B,然后B变成C,然后C再变成A等等),而我们平常接触的单据的状态,是不可以用状态模式去解决问题的。

第二,状态,并不简单是一个标识字段,对于它的客户端来说,它应该包括行为,因为行为改变状态,并且这种行为与状态的主体共享一个接口,当主体操作这些行为时,这些动作将转分为状态执行。

比如我们就以书上的例子说明

 public interface IAction
    {
        /// <summary>
        /// 存款
        /// </summary>
        /// <param name="amount"></param>
        void Deposit(decimal amount);
        /// <summary>
        /// 取消
        /// </summary>
        /// <param name="amount"></param>
        void WithDraw(decimal amount);

        /// <summary>
        /// 计算利息
        /// </summary>
        void PayInterest();

    }

所有状态以及主体都需要实现这样的接口,并且主体向外发布 这些接口服务。

另外,状态应该从实现了刚才的接口的对象之中继承,也就是状态们都来自于一个抽象的共离基类

  public abstract class BaseStatue : IAction
    {
        protected  void StateChangeCheck()
        {
            if (balance < 0)
                account.State = new RedState(this);
            else if (balance < lowerLimit)
                account.State = new SliverState(this);
        }
    }

这个抽象类应该把这个状态的变化封装到这些,由它去检测状态的变化。

这样我们每个状态的变化都会同时调用上面的这段判断函数。

另外,每个状态不仅包括了需要主体提供而来的转发服务,而且还需要包括这个状态的前一个状态,因为状态的转换是依据前一个状态而进行的。