MST

星途 面试题库

面试题:C# 代码重构中如何运用设计模式优化代码结构

现有一个C#的订单处理系统,其中包含订单创建、订单支付、订单发货等功能模块,不同功能模块之间耦合度较高。请阐述如何运用合适的设计模式(如策略模式、观察者模式等)对该系统进行代码重构,以降低耦合度,提高代码的可扩展性和可维护性,并给出关键代码示例。
46.6万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试

1. 策略模式重构订单支付模块

  • 分析:订单支付可能有多种方式,如支付宝支付、微信支付等,使用策略模式可以将不同支付方式封装成独立的策略类,降低与订单处理系统其他模块的耦合度。
  • 关键代码示例
    • 定义支付策略接口
public interface IPaymentStrategy
{
    void Pay(decimal amount);
}
- **具体支付策略类(以支付宝支付为例)**:
public class AlipayStrategy : IPaymentStrategy
{
    public void Pay(decimal amount)
    {
        Console.WriteLine($"使用支付宝支付{amount}元");
    }
}
- **订单类中使用支付策略**:
public class Order
{
    private IPaymentStrategy paymentStrategy;

    public Order(IPaymentStrategy paymentStrategy)
    {
        this.paymentStrategy = paymentStrategy;
    }

    public void PayOrder(decimal amount)
    {
        paymentStrategy.Pay(amount);
    }
}
- **使用示例**:
class Program
{
    static void Main()
    {
        IPaymentStrategy alipay = new AlipayStrategy();
        Order order = new Order(alipay);
        order.PayOrder(100m);
    }
}

2. 观察者模式重构订单发货模块

  • 分析:当订单支付成功后,可能需要通知多个模块进行发货操作等,使用观察者模式可以实现松耦合的通知机制。
  • 关键代码示例
    • 定义主题接口
public interface ISubject
{
    void Attach(IObserver observer);
    void Detach(IObserver observer);
    void Notify();
}
- **定义观察者接口**:
public interface IObserver
{
    void Update();
}
- **订单主题类**:
public class OrderSubject : ISubject
{
    private List<IObserver> observers = new List<IObserver>();
    private bool isPaid = false;

    public void Attach(IObserver observer)
    {
        observers.Add(observer);
    }

    public void Detach(IObserver observer)
    {
        observers.Remove(observer);
    }

    public void Notify()
    {
        if (isPaid)
        {
            foreach (var observer in observers)
            {
                observer.Update();
            }
        }
    }

    public void PayOrder()
    {
        isPaid = true;
        Notify();
    }
}
- **发货观察者类**:
public class ShippingObserver : IObserver
{
    public void Update()
    {
        Console.WriteLine("订单已支付,准备发货");
    }
}
- **使用示例**:
class Program
{
    static void Main()
    {
        OrderSubject orderSubject = new OrderSubject();
        ShippingObserver shippingObserver = new ShippingObserver();
        orderSubject.Attach(shippingObserver);
        orderSubject.PayOrder();
    }
}

通过上述策略模式和观察者模式的运用,可以有效降低订单处理系统不同功能模块之间的耦合度,提高代码的可扩展性和可维护性。