2022/07/11 (增加連結)
Behavioral Design Patterns主要是一些class與class的互動關係(溝通方式),不同的pattern要解決不同的問題。
讓你當一天艾森豪,來指揮諾曼地登陸作戰! (Command 命令模式) (c# & python)
雞同鴨講也可以通! (Interpreter 解譯器模式) (c# & python)
反覆器模式(Iterator) (c#)
別再孤軍奮戰! 做好做滿第一件事情先找到能調用資源的人! (Mediator 中介者模式) (c# & python)
觀察者模式 (c#)
察言觀色! 敵不動,我不動! (Observer 觀察者模式) (c# & python)
狀態模式(State Pattern) (c#)
別讓老闆和USER再問你好了沒? 隨時更新工作狀態吧! (State 狀態模式) (c# & python)
[Design Pattern實例] 在ASP.NET Core利用狀態模式來製造View Model (State) (.net)
Object-Oriented Design: Better State-Dependent Objects with the State Pattern
Keep it Simple with the Strategy Design Pattern (Javascript)
Avoid ugly If/else blocks & make your code modular with Strategy (javascript)
策略模式筆記 (c#)
謀略設計模式! 學習首重策略! (Strategy 策略模式) (c# & python)
ILogger是個interface
public interface ILogger
{
void Debug(string msg);
void Warn(string msg);
void Error(string msg);
}
TextLogger實作ILogger
public class TextLogger:ILogger
{
public void Debug(string msg) => System.Diagnostics.Trace.WriteLine($"(Text)Debug: {msg}");
public void Warn(string msg) => System.Diagnostics.Trace.WriteLine($"(Text)Warn: : {msg}");
public void Error(string msg) => System.Diagnostics.Trace.WriteLine($"(Text)Error: : {msg}");
}
DbLogger實作ILogger
public class DbLogger:ILogger
{
public void Debug(string msg) => System.Diagnostics.Trace.WriteLine($"(Database)Debug: {msg}");
public void Warn(string msg) => System.Diagnostics.Trace.WriteLine($"(Database)Warn: : {msg}");
public void Error(string msg) => System.Diagnostics.Trace.WriteLine($"(Database)Error: : {msg}");
}
MyTask連接interface (ILogger)
public class MyTask
{
private ILogger _logger = null;
public MyTask(ILogger logger)
{
if (logger != null)
this._logger = logger;
else
throw new ArgumentNullException("logger");
}
public void Run()
{
//Do something
this._logger.Debug($"My task was done on {DateTime.Now.ToString()}");
}
}
當一開始的時候,先利用文字檔來儲存log,因為一開始,多花一點小功夫,多寫一個interface(ILogger)
//For current iteration
ILogger logger = new TextLogger();
(new MyTask(logger)).Run();
等準備好了,只要改這個部分,其他的就不需要動了
//Refine in next iteration
ILogger logger = new DatabaseLogger();
(new MyTask(logger)).Run();
網頁上(\Controllers\UploadController.cs)遺漏了部分的程式碼:
[HttpPost]
public IActionResult Index(string fileType, FreightOrder fo)
{
ModelState.Clear();
IFoStrategy stg = null;
if (fileType.Equals("1"))
{
stg = new FoStrategyAppend();
ViewBag.Strategy = "採用策略:累加原單之數量";
}
else
{
stg = new FoStrategyReplace();
ViewBag.Strategy = "採用策略:覆蓋原單之數量";
}
stg.Query = DataAccessService.Query;
stg.Update = DataAccessService.Update;
updateFreightOrder(fo, stg);
return View(fo);
}
[ASP.NET]重構之路系列v6 –抽象來看程式是否符合DRY原則 (c#)
Template Method
一樣米養百種人! (Template Method 樣板方法) (c# & python)