搏客 Winning
After three days without programming, life becomes meaningless
posts - 46,  comments - 41,  trackbacks - 21

状态模式把研究对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的子类。
状态模式的意图是让一个对象在其内部状态发生变化的时候其行为也随之改变。
模式涉及的角色有:
1、抽象状态:定义一个接口封装环境对象的一个特定状态所对应的行为。
2、具体状态:每一个具体状态类都实现了环境的一个状态所对应的行为。
3、环境角色:定义客户端感兴趣的接口,并且保留一个具体状态类的实例这个实例给出此环境对象的现有状态。

在什么情况下使用状态模式
1、对象的行为依赖于它所处的状态
2、对象在某个方法里依赖于一重或多重的条件转移语句,其中有大量的条件判断代码。

状态模式实现的讨论
1、状态模式并没有规定哪个角色决定状态发生转换的条件如果转换条件是固定的则状态转换由Context来做
2、但是如果由State子类自己来决定下一继任者是谁则系统将更有灵活性。
3、或者由外界事件来决定状态的转变。
状态对象的创建
1、需要的时候创建,使用完毕立即消去。
2、事先创建所有的状态对象。

using System;

namespace DesignPattern.State
{
    
/// <summary>
    
/// 抽象状态 状态接口
    
/// </summary>

    public interface ITcpState
    
{
        
void Open();
        
void Close();
        
void Acknowledge();
    }


    
/// <summary>
    
/// 此类相当于Context
    
/// </summary>

    public class TcpConnection
    
{
        
private ITcpState state;

        
public ITcpState State
        
{
            
set{this.state=value;}
        }


        
public void Open()
        
{
            
this.State=new TcpEstablished();
            
this.state.Open();
            
this.State=new TcpListen();
        }


        
public void Close()
        
{
            
this.state.Close();
            
this.State=new TcpClosed();
        }


        
public void Acknowledge()
        
{
            
this.state.Acknowledge();
        }

    }


    
public class TcpEstablished : ITcpState
    
{
        
        
public void Open()
        
{
            Console.WriteLine(
"Have opened,can not open again!");
        }


        
public void Close()
        
{
            Console.WriteLine(
"Closing");
        }


        
public void Acknowledge()
        
{
            Console.WriteLine(
"TcpEstablished!");
        }


    }


    
public class TcpListen : ITcpState
    
{
        
public void Open()
        
{
            Console.WriteLine(
"Have opened,can not open again!");
        }


        
public void Close()
        
{
            Console.WriteLine(
"Closing");
        }


        
public void Acknowledge()
        
{
            Console.WriteLine(
"TcpListen!");
        }



    }


    
public class TcpClosed : ITcpState
    
{
        
public void Open()
        
{
            Console.WriteLine(
"Openning");
        }


        
public void Close()
        
{
            Console.WriteLine(
"Have closed,can not close again!");
        }


        
public void Acknowledge()
        
{
            Console.WriteLine(
"TcpClosed!");
        }


    }


    
public class Client
    
{
        
public static void Main()
        
{
            TcpConnection tcpcon
=new TcpConnection();
            tcpcon.Open();
            tcpcon.Acknowledge();
            tcpcon.Open();
            tcpcon.Close();
            tcpcon.Acknowledge();
            tcpcon.Close();
        }

    }

}

posted on 2005-04-15 09:31 搏客 Winning 阅读(824) 评论(1)  编辑 收藏 所属分类: 架构设计

FeedBack:
2006-07-19 22:40 | 星星远好 [未注册用户]
理论论述得不错,代码也写得非常优秀。但针对初学者,要是有一点图形,有点现实生活中例子帮助理解的话,可能会更好!
  回复  引用    

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-02-28 16:02 编辑过
 
 




与我联系

搜索

 

常用链接

随笔分类

随笔档案

积分与排名

  • 积分 - 30413
  • 排名 - 1312

最新评论

阅读排行榜