class User { public string Name { get; set; } public string PassWord { get; set; } } class UserService { public void Register(User user) { if (user.Name == "Kirin") { Log("注冊失敗,已經包含名為" + user.Name + "的用戶"); } else { Log("注冊成功!"); } } PRivte void Log(string message) { Console.WriteLine(message); } } UserService類封裝用戶登錄的邏輯,并根據不同的登錄情況向控制臺打印不同的日志內容。當程序關閉時,所記錄的日志自然也隨之消失。
客戶端的代碼為
class Program { static void Main(string[] args) { User user = new User { Name = "Kirin", Password = "123" }; UserService service = new UserService(); service.Register(user); Console.ReadLine(); } } 使用策略模式
class ConsoleLog : ILog { public void Log(string message) { Console.WriteLine(message); } } class TextLog : ILog { public void Log(string message) { using (StreamWriter sw = File.AppendText("log.txt")) { sw.WriteLine(message); sw.Flush(); sw.Close(); } } } 在UserService類中添加一個ILog類型的屬性LogStrategy。
class UserService { public ILog LogStrategy { get; set; } public UserService() { LogStrategy = new ConsoleLog(); } public void Register(User user) { if (user.Name == "Kirin") { LogStrategy.Log("注冊失敗,已經包含名為" + user.Name + "的用戶"); } else { LogStrategy.Log("注冊成功!"); } } } 客戶端代碼變為如下形式。
class Program { static void Main(string[] args) { User user = new User { Name = "Kirin", Password = "123" }; UserService service = new UserService { LogStrategy = new TextLog() }; service.Register(user); Console.ReadLine(); } } 在聲明UserService的時候,還可以將將LogStrategy設置為TextLog。這樣在UserService進行邏輯處理時,使用的LogStrategy即為TextLog,日志將輸出到文本文件中。
static void Main(string[] args) { User user = new User { Name = "Kirin", Password = "123" }; UserService service = new UserService(); service.LogDelegate = LogToConsole; service.LogDelegate += LogToTextFile; service.Register(user); Console.ReadLine(); } 在構造委托時,我們還可以使用匿名方法和Lambda表達式,在老趙的文章中詳細闡述了這些寫法的演變。