在C#中,設計模式可以幫助我們優化代碼,提高代碼的可維護性、可擴展性和可重用性。以下是一些常見的設計模式和如何優化代碼的方法:
單一職責原則要求一個類只負責一項職責。這樣可以降低類的復雜性,提高內聚性。
// 不符合單一職責原則
public class OrderProcessor
{
public void ProcessOrder(Order order)
{
// 處理訂單邏輯
// ...
// 發送訂單確認郵件
// ...
}
}
// 符合單一職責原則
public class OrderProcessor
{
private readonly EmailSender _emailSender;
public OrderProcessor(EmailSender emailSender)
{
_emailSender = emailSender;
}
public void ProcessOrder(Order order)
{
// 處理訂單邏輯
// ...
}
public void SendOrderConfirmationEmail(Order order)
{
_emailSender.Send(order.Email, "Order Confirmation");
}
}
開閉原則要求軟件實體對擴展開放,對修改關閉。這意味著當需要添加新功能時,應該通過添加新代碼來實現,而不是修改現有代碼。
// 不符合開閉原則
public class PaymentGateway
{
public void ProcessPayment(Payment payment)
{
if (payment.Method == "CreditCard")
{
// 處理信用卡支付
}
else if (payment.Method == "PayPal")
{
// 處理PayPal支付
}
}
}
// 符合開閉原則
public interface IPaymentGateway
{
void ProcessPayment(Payment payment);
}
public class CreditCardGateway : IPaymentGateway
{
public void ProcessPayment(Payment payment)
{
// 處理信用卡支付
}
}
public class PayPalGateway : IPaymentGateway
{
public void ProcessPayment(Payment payment)
{
// 處理PayPal支付
}
}
里氏替換原則要求子類可以替換其父類而不影響程序的正確性。
// 不符合里氏替換原則
public class Bird
{
public virtual void Fly()
{
// 飛行邏輯
}
}
public class Penguin : Bird
{
public override void Fly()
{
// 企鵝不能飛
}
}
// 符合里氏替換原則
public abstract class Bird
{
public abstract void Fly();
}
public class Penguin : Bird
{
public override void Fly()
{
// 企鵝不能飛
}
}
依賴倒置原則要求高層模塊不應該依賴于低層模塊,兩者都應該依賴于抽象。
// 不符合依賴倒置原則
public class Database
{
public string GetData(string query)
{
// 從數據庫獲取數據
}
}
public class UserRepository
{
private readonly Database _database;
public UserRepository(Database database)
{
_database = database;
}
public User GetUserById(int id)
{
return _database.GetData($"SELECT * FROM Users WHERE Id = {id}");
}
}
// 符合依賴倒置原則
public interface IUserRepository
{
User GetUserById(int id);
}
public class UserRepository : IUserRepository
{
private readonly Database _database;
public UserRepository(Database database)
{
_database = database;
}
public User GetUserById(int id)
{
return _database.GetData($"SELECT * FROM Users WHERE Id = {id}");
}
}
裝飾器模式允許動態地給對象添加新的功能,而不需要修改現有代碼。
// 不使用裝飾器模式
public class Coffee
{
public string GetDescription()
{
return "Coffee";
}
public double GetCost()
{
return 1.99;
}
}
// 使用裝飾器模式
public interface ICoffee
{
string GetDescription();
double GetCost();
}
public class Coffee : ICoffee
{
public string GetDescription()
{
return "Coffee";
}
public double GetCost()
{
return 1.99;
}
}
public class Milk : ICoffee
{
private readonly ICoffee _coffee;
public Milk(ICoffee coffee)
{
_coffee = coffee;
}
public string GetDescription()
{
return $"{_coffee.GetDescription()}, Milk";
}
public double GetCost()
{
return _coffee.GetCost() + 0.49;
}
}
通過使用這些設計模式,可以有效地優化C#代碼,提高代碼的質量和可維護性。