//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" };
}
}
//应该首先抽象状态
//稳定后。再抽象人。不然一上来太复杂了