在C#中,設(shè)計(jì)模式可以幫助我們優(yōu)化代碼,提高代碼的可維護(hù)性、可擴(kuò)展性和可重用性。以下是一些常見(jiàn)的設(shè)計(jì)模式和如何優(yōu)化代碼的方法:
單一職責(zé)原則要求一個(gè)類只負(fù)責(zé)一項(xiàng)職責(zé)。這樣可以降低類的復(fù)雜性,提高內(nèi)聚性。
// 不符合單一職責(zé)原則
public class OrderProcessor
{
public void ProcessOrder(Order order)
{
// 處理訂單邏輯
// ...
// 發(fā)送訂單確認(rèn)郵件
// ...
}
}
// 符合單一職責(zé)原則
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");
}
}
開(kāi)閉原則要求軟件實(shí)體對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。這意味著當(dāng)需要添加新功能時(shí),應(yīng)該通過(guò)添加新代碼來(lái)實(shí)現(xiàn),而不是修改現(xiàn)有代碼。
// 不符合開(kāi)閉原則
public class PaymentGateway
{
public void ProcessPayment(Payment payment)
{
if (payment.Method == "CreditCard")
{
// 處理信用卡支付
}
else if (payment.Method == "PayPal")
{
// 處理PayPal支付
}
}
}
// 符合開(kāi)閉原則
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()
{
// 企鵝不能飛
}
}
依賴倒置原則要求高層模塊不應(yīng)該依賴于低層模塊,兩者都應(yīng)該依賴于抽象。
// 不符合依賴倒置原則
public class Database
{
public string GetData(string query)
{
// 從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)
}
}
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}");
}
}
裝飾器模式允許動(dòng)態(tài)地給對(duì)象添加新的功能,而不需要修改現(xiàn)有代碼。
// 不使用裝飾器模式
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;
}
}
通過(guò)使用這些設(shè)計(jì)模式,可以有效地優(yōu)化C#代碼,提高代碼的質(zhì)量和可維護(hù)性。