Facade 稱為外觀或表面模式,不過比較常聽到英文說法;請聽一下這個單字的念法吧!
Amy(PO):
As a 資料分析者
I want 使用者在執行任一系統功能時,系統可以同時記錄使用記錄在文字檔和資料庫
So that 我們可以知道使用者何時使用了該功能和次數
JB:
哈! 果然這次Iteration Planning,他們決定把所有使用者行為記錄在文字檔和資料庫! 我們先前建立的TextLogger
和DbLogger
兩個策略類別可以派上用場了,讓我直接在主程式加上他們。
Lily:
等等,你不該直接在每個功能呼叫兩個記錄的策略類別。
JB:
喔喔! 你指的是先記錄的行為封裝在另一個類別,對吧!?
Lily:
對,而且之後如果我們有其他記錄的策略或是新需求,我們可以直接修改這個新的類別即可。
封裝商業邏輯並提供簡單介面,以達到易使用、可讀性、減少依賴的目的 (WIKI)
由前面的設計討論,我們決定將Logger的行為封裝,避免依賴於DbLogger
和TextLogger
類別(請參考Day3文章)。
public class MyLogger
{
public void Warn(string msg)
{
var textLogger = new TextLogger();
var dbLogger = new DbLogger();
textLogger.Warn(msg);
dbLogger.Warn(msg);
}
public void Read()
{
System.Diagnostics.Trace.WriteLine($"(Database)Dump logs.");
System.Diagnostics.Trace.WriteLine($"(Text)Dump logs.");
}
}
class MyLogger:
def warn(self, msg):
textLogger = TextLogger()
dbLogger = DbLogger()
textLogger.warn(msg)
dbLogger.warn(msg)
def read(self):
print("(Database)Dump logs.")
print("(Text)Dump logs.")
主程式:
var facade = new MyLogger();
facade.Warn("Facade works!");
facade.Read();
logger = MyLogger()
logger.warn("Facade works!")
logger.read()