Net设计模式实例之状态模式(State Pattern)

简介:

一、状态模式简介(Brief Intro du ction

状态模式(State Pattern),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

二、解决的问题(What To Solve

状态模式主要解决的是当控制一个对象状态装换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简单化。

当一个对象行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。

三、状态模式分析(Analysis

1、状态模式结构

 

Context类:维护一个ConcreteState子类的一个实例,这个实例定义当前的状态。

State类:抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为。

ConcreteStateA,ConcreteStateB,ConcreteStateC类:具体状态类,每一个子类实现一个与Context的一个状态相关的行为。

2、源代码

1Context类:维护一个ConcreteState子类的一个实例,这个实例定义当前的状态

public class Context

{

    private State state;

 

    public  State   State

    {

        get { return state; }

        set

        {

            state = value;

            Console.WriteLine("当前状态是:" + state.GetType().Name);

        }

    }

    public Context(State state)

    {

        this.state = state;

        Console.WriteLine("初始状态是:"+state.GetType().Name);

    }

 

    public void Request()

    {

        state.Handle(this);

    }

}

 

2抽象状态类及其具体实现类

public abstract class State

{

   public abstract void Handle(Context context);

}

 

public class ConcreteStateA:State

{

    public override void Handle(Context context)

    {

        context.State = new ConcreteStateB();

    }

}

 

public class ConcreteStateBState

{

    public override void Handle(Context context)

    {

        context.State = new ConcreteStateC();

    }

}

public class ConcreteStateC : State

{

    public override void Handle(Context context)

    {

        context.State = new ConcreteStateA();

    }

}

 

4、客户端代码

static void  Main (string[] args)

{

    Context context = new Context(new ConcreteStateA());

    context.Request();

    context.Request();

    context.Request();

    Console.Read();

}

3、程序运行结果

四.案例分析(Example

1、场景

银行账户根据余额可分为三种状态RedStateSilverStateGoldState,这些状态分别代表了透支帐户(overdrawn accounts),新开帐户(starter accounts),标准帐户(accounts in good standing)..如下图所示

 

RedState:账号余额在范围【0.0,1000.0】表示处于处于SilverState。否则转换为其他状态

if (balance < lowerLimit)

{

    account.State = new RedState(this);

}

else if (balance > upperLimit)

{

    account.State = new GoldState(this);

}

 

SilverState账号余额在范围【-100.0,0】表示处于处于RedState。否则转换为其他状态

if (balance > upperLimit)

{

    account.State = new SilverState(this);

}

 

GoldState账号余额在范围【1000.0,10000000.0】表示处于处于GoldState。否则转换为其他状态

if (balance < 0.0)

{

    account.State = new RedState(this);

}

else if (balance < lowerLimit)

{

    account.State = new SilverState(this);

}

2、代码

1、类Account相当于Context

class Account

    {

        private State _state;

        private string _owner;

        // Constructor

        public Account(string owner)

        {

            // New accounts are 'Silver' by default

            this._owner = owner;

 

            this._state = new SilverState(0.0, this);

        }

 

        // Properties

        public double Balance

        {

            get { return _state.Balance; }

        }

        public  State   State

        {

            get { return _state; }

            set { _state = value; }

        }

        public void Deposit(double amount)

        {

            _state.Deposit(amount);

            Console.WriteLine("Deposited {0:C} --- ", amount);

            Console.WriteLine(" Balance = {0:C}"this.Balance);

            Console.WriteLine(" Status = {0}",

              this.State.GetType().Name);

            Console.WriteLine("");

        }

        public void Withdraw(double amount)

        {

            _state.Withdraw(amount);

            Console.WriteLine("Withdrew {0:C} --- ", amount);

            Console.WriteLine(" Balance = {0:C}"this.Balance);

            Console.WriteLine(" Status = {0}\n",

              this.State.GetType().Name);

        }

 

        public void PayInterest()

        {

            _state.PayInterest();

            Console.WriteLine("Interest Paid --- ");

            Console.WriteLine(" Balance = {0:C}"this.Balance);

            Console.WriteLine(" Status = {0}\n",

              this.State.GetType().Name);

        }

    }

 

2、抽象状态类State及其具体状态类RedStateSilverStateGoldState

/// <summary>

    /// The 'State' abstract class

    /// </summary>

    abstract class State

    {

        protected Account account;

        protected double balance;

        protected double interest;

        protected double lowerLimit;

        protected double upperLimit;

 

        // Properties

        public Account Account

        {

            get { return account; }

            set { account = value; }

        }

        public double Balance

        {

            get { return balance; }

            set { balance = value; }

        }

        public abstract void Deposit(double amount);

        public abstract void Withdraw(double amount);

        public abstract void PayInterest();

 

    }

 

    /// <summary>

    /// A 'ConcreteState' class

    /// <remarks>

    /// Red indicates that account is overdrawn

    /// </remarks>

    /// </summary>

    class RedState : State

    {

        private double _serviceFee;

        // Constructor

        public RedState(State state)

        {

            this.balance = state.Balance;

            this.account = state.Account;

            Initialize();

        }

        private void Initialize()

        {

            // Should come from a datasource

            interest = 0.0;

            lowerLimit = -100.0;

            upperLimit = 0.0;

            _serviceFee = 15.00;

        }

 

        public override void Deposit(double amount)

        {

            balance += amount;

            StateChangeCheck();

        }

 

        public override void Withdraw(double amount)

        {

            amount = amount - _serviceFee;

            Console.WriteLine("No funds available for withdrawal!");

        }

 

        public override void PayInterest()

        {

            // No interest is paid

        }

 

        private void StateChangeCheck()

        {

            if (balance > upperLimit)

            {

                account.State = new SilverState(this);

            }

        }

    }

    /// <summary>

 

    /// A 'ConcreteState' class

    /// <remarks>

    /// Silver indicates a non-interest bearing state

    /// </remarks>

    /// </summary>

    class SilverState : State

    {

        // Overloaded constructors

        public SilverState(State state)

            :

          this(state.Balance, state.Account)

        {

 

        }

        public SilverState(double balance, Account account)

        {

            this.balance = balance;

            this.account = account;

            Initialize();

        }

 

        private void Initialize()

        {

            // Should come from a datasource

            interest = 0.0;

            lowerLimit = 0.0;

            upperLimit = 1000.0;

        }

 

        public override void Deposit(double amount)

        {

            balance += amount;

            StateChangeCheck();

        }

        public override void Withdraw(double amount)

        {

            balance -= amount;

            StateChangeCheck();

        }

        public override void PayInterest()

        {

            balance += interest * balance;

            StateChangeCheck();

 

        }

        private void StateChangeCheck()

        {

            if (balance < lowerLimit)

            {

                account.State = new RedState(this);

            }

            else if (balance > upperLimit)

            {

                account.State = new GoldState(this);

            }

        }

    }

    /// <summary>

    /// A 'ConcreteState' class

    /// <remarks>

    /// Gold indicates an interest bearing state

    /// </remarks>

    /// </summary>

    class GoldState : State

    {

        // Overloaded constructors

        public GoldState(State state)

            this(state.Balance, state.Account)

        {

        }

        public GoldState(double balance, Account account)

        {

            this.balance = balance;

            this.account = account;

            Initialize();

        }

        private void Initialize()

        {

            // Should come from a database

            interest = 0.05;

            lowerLimit = 1000.0;

            upperLimit = 10000000.0;

        }

        public override void Deposit(double amount)

        {

            balance += amount;

            StateChangeCheck();

 

        }

        public override void Withdraw(double amount)

        {

            balance -= amount;

            StateChangeCheck();

        }

 

        public override void PayInterest()

        {

            balance += interest * balance;

            StateChangeCheck();

        }

 

        private void StateChangeCheck()

        {

            if (balance < 0.0)

            {

                account.State = new RedState(this);

            }

            else if (balance < lowerLimit)

            {

                account.State = new SilverState(this);

            }

        }

    }

 

3、客户端代码

static void  Main (string[] args)

{

    // Open a new account

    Account account = new Account("Jim Johnson");

    // Apply financial transactions

    account.Deposit(500.0);

    account.Deposit(300.0);

    account.Deposit(550.0);

    account.PayInterest();

    account.Withdraw(2000.00);

    account.Withdraw(1100.00);

    // Wait for user

    Console.ReadKey();

}

 

3、程序运行结果

五、总结(Summary

状态模式(State Pattern),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。当一个对象行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。



本文转自灵动生活博客园博客,原文链接:http://www.cnblogs.com/ywqu/archive/2010/01/26/1656418.html ,如需转载请自行联系原作者

相关文章
|
7月前
|
设计模式 缓存 安全
【设计模式】单例模式:确保类只有一个实例
【设计模式】单例模式:确保类只有一个实例
86 0
|
设计模式 安全 Java
JAVA设计模式1:单例模式,确保每个类只能有一个实例
JAVA设计模式1:单例模式,确保每个类只能有一个实例
123 0
|
3月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性本文旨在探讨PHP中常见的设计模式及其应用,帮助开发者编写出更加灵活、可维护和易于扩展的代码。通过深入浅出的解释和实例演示,我们将了解如何使用设计模式解决实际开发中的问题,并提升代码质量。
在软件开发过程中,设计模式是一套经过验证的解决方案模板,用于处理常见的软件设计问题。PHP作为流行的服务器端脚本语言,也有其特定的设计模式应用。本文将重点介绍几种PHP中常用的设计模式,包括单例模式、工厂模式和策略模式,并通过实际代码示例展示它们的具体用法。同时,我们还将讨论如何在实际项目中合理选择和应用这些设计模式,以提升代码的可维护性和扩展性。
70 4
|
2月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
3月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。
|
3月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
55 2
|
6月前
|
设计模式 安全 Java
Java中的单例模式是一种设计模式,它保证一个类只有一个实例,并提供一个全局访问点
Java单例模式确保类仅有一个实例,并提供全局访问点。常见实现包括: - 饿汉式:静态初始化,线程安全。 - 懒汉式:延迟初始化,需同步保证线程安全。 - 双重检查锁定:优化懒汉式,减少同步开销。 - 静态内部类:延迟加载,线程安全。 - 枚举:简洁线程安全,不适用于复杂构造。 - 容器实现:如Spring框架,用于依赖注入。选择依据需求,如延迟加载、线程安全和扩展性。
72 10
|
5月前
|
设计模式 缓存 JavaScript
js设计模式实例
【7月更文挑战第2天】JavaScript设计模式包含工厂、单例、建造者、抽象工厂和代理模式等,它们是最佳实践和可重用模板,解决创建、职责分配和通信等问题。例如,工厂模式封装对象创建,单例确保全局唯一实例,建造者模式用于复杂对象构建,抽象工厂创建相关对象集合,而代理模式则控制对象访问。这些模式提升代码质量、可读性和灵活性,是高效开发的关键。
43 0
|
7月前
|
设计模式 Java 数据库
二十三种设计模式全面解析-单例设计模式:解密全局独一无二的实例创造者
二十三种设计模式全面解析-单例设计模式:解密全局独一无二的实例创造者
|
开发框架 .NET API
Hangfire .NET任务调度框架实例
# 1、介绍 Hangfire是一个开源的.NET任务调度框架,提供了内置集成化的控制台(后台任务调度面板),可以直观明了的查看作业调度情况。 # 2、Nuget安装 ![请在此添加图片描述](https://developer-private-1258344699.cos.ap-guangzhou.myqcloud.com/column/article/5877188/20231031-119e3068.png?x-cos-security-token=baeOYKJ0BOuKXaDG6L8qKX7pdH823CLaaefd8181d9b33eccf4b2a2f35cd15dd7jLbyf
100 0
Hangfire .NET任务调度框架实例