public class SqlMessage : AbstractMessageState
{
public SqlMessage(Message message) { _message = message; }
public override void StateChangeCheck() { /* SQL 狀態無需切換 */ }
public override List Get()
{
return new List { new MessageModel("SQL方式獲取Message", DateTime.Now) };
}
public override bool Insert(MessageModel mm) => true; // 略
}
持有抽象狀態引用,委派操作給當前狀態,並在操作前檢查狀態切換:
public class Message
{
private AbstractMessageState _abstractMessageState;
public AbstractMessageState AbstractMessageState
{
get => _abstractMessageState;
set => _abstractMessageState = value;
}
private string _userId;
public string UserId { get => _userId; set => _userId = value; }
public Message(string userId)
{
_userId = userId;
_abstractMessageState = new XMLMessage(this); // 預設狀態
}
public List Get()
{
_abstractMessageState.StateChangeCheck(); // 檢查是否需切換
return _abstractMessageState.Get();
}
public bool Insert(MessageModel mm)
{
_abstractMessageState.StateChangeCheck();
return _abstractMessageState.Insert(mm);
}
}
Context 不知具體狀態細節,僅透過抽象介面互動 — 核心解耦點。