状态模式。状态机

//1. 对业务的足够分析&拆解
//2. 先画图。如uml,可行性分析,完整性分析
//3. 如果没有概念与经验:先简单拆解。 全上太复杂,不一定能实现
//4.不一定要追求完美,不一定要完全符合模式,很多时候,这做不到。

//应该首先抽象状态
//稳定后。再抽象人。不然一上来太复杂了

简单:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace state_pattern
{
    internal class statepatternpure
    {
    }
  

    public abstract class State
    {
        public abstract void Handle(Context context);
        
    }

    public class AjaxInfo
    {
        public fats fs { get; set; }
        public string Message { get; set; }
        public override string ToString()
        {
            return Message;
        }
    }


    public class Context
    {
        State state;
        Person person;
        Asset asset;
        AjaxInfo ajaxInfo;//return result
                          // Constructor
        public Context(State state, AjaxInfo ajaxInfo)
        {
            this.State = state;
            this.ajaxInfo = ajaxInfo;


        }
        // Gets or sets the state
        public State State
        {
            get { return state; }
            set
            {
                state = value;
                Console.WriteLine("State: " + state.GetType().Name);
            }
        }
      
        public AjaxInfo AjaxInfo
        {
            get { return ajaxInfo; }
            set
            {
                ajaxInfo = value;
                Console.WriteLine("ajaxInfo: " + state.GetType().Name);
            }
        }
        public AjaxInfo Request()
        {
            //state.Entry(this);
            state.Handle(this);
            //state.Exit(this);
            return ajaxInfo;
        }

    }



    //----------------------------------------------


    /// <summary>
    /// A 'ConcreteStateFisrt' class
    /// </summary>
    public class ConcreteStateFirst : State
    {
        
        public override void Handle(Context context)
        {
          

        }
    }

    public class ConcreteStateSample : State
    {
       

        public override void Handle(Context context)
        {

           

        }
    }

}

增加复杂度:很难搞

// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

var ctx_first_emp = new Context(new ConcreteStateFirst(), new emp() { dept = "12345" ,emp_no = "741"}, new Asset() { code = "12345" }, new AjaxInfo()  );
var ctx_first_port = new Context(new ConcreteStateFirst(), new port() { dept = "12345", emp_no = "741" }, new Asset() { code = "12345" }, new AjaxInfo());
var ctx_first_finace = new Context(new ConcreteStateFirst(), new finace() { dept = "12345", emp_no = "741" }, new Asset() { code = "12345" }, new AjaxInfo());
var ctx_sample_emp = new Context(new ConcreteStateSample(), new emp() { dept = "12345", emp_no = "741" }, new Asset() { code = "12345" }, new AjaxInfo());
var ctx_sample_port = new Context(new ConcreteStateSample(), new port() { dept = "12345", emp_no = "741" }, new Asset() { code = "12345" }, new AjaxInfo());
var ctx_sample_finace = new Context(new ConcreteStateSample(), new finace() { dept = "12345", emp_no = "741" }, new Asset() { code = "12345" }, new AjaxInfo());

// Setup context in a state
// Issue requests, which toggles state
Console.WriteLine(ctx_first_emp.Request()); 
Console.WriteLine(ctx_first_port.Request());
Console.WriteLine(ctx_first_finace.Request()); 
Console.WriteLine(ctx_sample_emp.Request());
Console.WriteLine(ctx_sample_port.Request()); 
Console.WriteLine(ctx_sample_finace.Request());



/// <summary>
/// The 'State' abstract class
/// </summary>

public abstract class State
{
    public abstract void Handle(Context context);
    public abstract void Entry(Context context);//进入状态动作(init?)
    public abstract void Exit(Context context);// 退出状态动作
}

public class AjaxInfo
{
    public fats fs { get; set; }
    public string Message { get; set; }
    public override string ToString()
    {
        return Message;
    }
}

public abstract class Person
{
    public abstract void SetFats(Context ctx);
    public abstract Asset hasAsset(Asset asset);
    public abstract string Name { get; set; }
    public abstract fats fs { get; set; }
    public abstract string dept { get; set; }
    public abstract string emp_no { get; set; }

}
public   class emp:Person
{

    public override string Name { get; set; }
    public override string dept { get; set ; }
    public override string emp_no { get; set ; }
    public override fats fs { get; set; }

    public override Asset hasAsset(Asset asset)
    {
       
        if (asset.code == fs.list[0].code)// if code in list  true
            return fs.list[0];
        else return null;
    }

    public override void SetFats(Context ctx)
    {
        fs = new fats();
        fs.list.Add(new Asset() { code = "12345",emp_no = "742" });//sql query result
    }
}
public   class port:emp
{
    public   fats fs;

    public override void SetFats(Context ctx)
    {
        fs = new fats();
        fs.list.Add(new Asset() { code = "12345", emp_no = "741" });//sql query result
        fs.list.Add(new Asset() { code = "67890", emp_no = "741" });//sql query result
    }

    public fats GetFats(Context ctx)
    {
        return fs;// sql query result
    }

    public  Asset hasAsset(Asset asset)
    {
        fs.list.Append(new Asset() { code = "12345",emp_no="741" });//sql query result
        if (asset.code == fs.list[0].code)
            return fs.list[0];
        else return null;

    }
}
public   class finace : port
{
    fats fs;
   

}

public class Asset
{
   public string code;
    public string emp_no;
}

public  class fats
{
   public List<Asset> list = new List<Asset>();  
}
/// <summary>
/// The 'Context' class
/// </summary>

public   class Context
{
    State state;
    Person person;
    Asset asset;
    AjaxInfo ajaxInfo;//return result
    // Constructor
    public Context(State state,Person person,Asset asset,AjaxInfo ajaxInfo)
    {
        this.State = state;
        this.person = person;
        this.asset = asset;
        this.ajaxInfo = ajaxInfo;

        
    }
    // Gets or sets the state
    public State State
    {
        get { return state; }
        set
        {
            state = value;
            Console.WriteLine("State: " + state.GetType().Name);
        }
    }
    public Person Person { get { return person; } 
        set
        {
            person = value;
            Console.WriteLine("Person: " + state.GetType().Name);
        }
    }
    public Asset Asset
    {
        get { return asset; }
        set { asset = value;
            Console.WriteLine("Asset: " + state.GetType().Name);
        }
    }
    public AjaxInfo AjaxInfo
    {
        get { return ajaxInfo; }
        set
        {
            ajaxInfo = value;
            Console.WriteLine("ajaxInfo: " + state.GetType().Name);
        }
    }
    public AjaxInfo Request()
    {
       //state.Entry(this);
        state.Handle(this);
        //state.Exit(this);
        return ajaxInfo;
    }

}



//----------------------------------------------


/// <summary>
/// A 'ConcreteStateFisrt' class
/// </summary>
public class ConcreteStateFirst : State
{
    public override void Entry(Context context)
    {
        //chcek  if not in exirped first period  return 
        // check the context.asset.code in all first fasts. else return 

        
    }

    public override void Exit(Context context)
    {
        throw new NotImplementedException();
    }

    public override void Handle(Context context)
    {
        //checkfasts is user 
        context.Person.SetFats(context);
        if (context.Person.emp_no != context.Person.fs.list[0].emp_no)
        {
            context.AjaxInfo.Message = "NG,this no yours asset. from first state ";
            return;
        }
        context.AjaxInfo = new AjaxInfo { fs = context.Person.fs, Message = "ok,from first state " };

    }
}

public class ConcreteStateSample : State
{
    public override void Entry(Context context)
    {
       
    }

    public override void Exit(Context context)
    {
        throw new NotImplementedException();
    }

    public override void Handle(Context context)
    {

        if (context.Person is emp)
        {
            context.AjaxInfo = new AjaxInfo { fs = context.Person.fs, Message = "ng, sampele period not is emp" };
            return;
        }
        context.Person.SetFats(context);

        context.AjaxInfo =  new AjaxInfo { fs = context.Person.fs, Message = "ok" };

    }
}


//应该首先抽象状态
//稳定后。再抽象人。不然一上来太复杂了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值