状态模式。状态机

//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// Constructorpublic Context(State state, AjaxInfo ajaxInfo){this.State = state;this.ajaxInfo = ajaxInfo;}// Gets or sets the statepublic 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;}}//----------------------------------------------/// /// A 'ConcreteStateFisrt' class/// 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());/// 
/// The 'State' abstract class
/// 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  truereturn 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 resultfs.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 resultif (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>();  
}
/// 
/// The 'Context' class
/// public   class Context
{State state;Person person;Asset asset;AjaxInfo ajaxInfo;//return result// Constructorpublic 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 statepublic 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;}}//----------------------------------------------/// 
/// A 'ConcreteStateFisrt' class
/// 
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" };}
}//应该首先抽象状态
//稳定后。再抽象人。不然一上来太复杂了


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部