对面向对象编程原则和设计模式有扎实的理解

招聘要求中提到的**“对面向对象编程原则和设计模式有扎实的理解”,指的是能够编写出高内聚、低耦合、易扩展、易维护**的代码,而不是简单地把代码堆砌在几个类里。

这主要包含 面向对象三大特性SOLID 五大设计原则 以及 常用设计模式 3 个层面的具体能力。


1. 面向对象三大特性(基础)

  • 封装 (Encapsulation): 隐藏内部实现细节,仅暴露必要的接口(利用 private / public / protected 保护数据)。
  • 继承 (Inheritance): 提取代码复用,建立 “is-a” 的层级关系(警惕过度继承,优先考虑组合)。
  • 多态 (Polymorphism): 基于抽象(接口或抽象类)编写代码,运行时动态绑定具体实现。

2. SOLID 设计原则(核心)

原则名称核心思想反面教材 vs 正确做法
S单一职责原则 (SRP)一个类应该只有一个发生变化的原因。反面:一个 UserService 既处理业务逻辑,又直接拼 SQL 发送邮件。正确:拆分为 UserServiceUserRepositoryEmailService
O开闭原则 (OCP)对扩展开放,对修改关闭。扩展新功能时,尽量通过添加新类来实现,而不是修改原有代码
L里氏替换原则 (LSP)子类必须能够替换掉它们的父类(或接口)。不要在子类重写方法时直接 throw new NotImplementedException()
I接口隔离原则 (ISP)客户端不应该依赖它不需要的接口。避免定义庞大的“万能接口”,将其拆分为多个职责明确的小接口。
D依赖倒置原则 (DIP)高层模块不应该依赖低层模块,二者都应该依赖于抽象。依赖于 INotificationService 接口,而不是具体的 SmsService 类(配合依赖注入 DI)。

3. 常用设计模式(实践应用)

面试和日常开发中最常考查的三类模式:

  • 创建型 (Creational): 单例模式 (Singleton)工厂模式 (Factory)建造者模式 (Builder)。解决“如何优雅地创建对象”。
  • 结构型 (Structural): 适配器模式 (Adapter)装饰器模式 (Decorator)代理模式 (Proxy)。解决“如何组合类与对象”。
  • 行为型 (Behavioral): 观察者模式 (Observer)策略模式 (Strategy)模板方法 (Template Method)。解决“对象间如何协作与分工”。

4. 代码重构示例:违反原则 vs 符合原则

假设要开发一个支付处理系统,支持微信支付和支付宝。

❌ 坏代码(违反 OCP 和 DIP,耦合度极高)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// 违背开闭原则:每次增加新支付方式(如 Apple Pay),都必须修改这个类和 switch 语句
public class PaymentProcessor
{
    public void Process(string paymentType, decimal amount)
    {
        if (paymentType == "WeChat")
        {
            // 微信支付逻辑
            Console.WriteLine($"使用微信支付了 {amount} 元");
        }
        else if (paymentType == "Alipay")
        {
            // 支付宝支付逻辑
            Console.WriteLine($"使用支付宝支付了 {amount} 元");
        }
        else
        {
            throw new NotSupportedException("不支持的支付类型");
        }
    }
}

✅ 好代码(结合 策略模式 + SOLID 原则)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// 1. 定义抽象接口(依赖倒置原则 DIP + 策略模式)
public interface IPaymentStrategy
{
    void Pay(decimal amount);
}

// 2. 封装具体策略(单一职责原则 SRP)
public class WeChatPayStrategy : IPaymentStrategy
{
    public void Pay(decimal amount) => Console.WriteLine($"[微信] 成功支付 {amount} 元");
}

public class AlipayStrategy : IPaymentStrategy
{
    public void Pay(decimal amount) => Console.WriteLine($"[支付宝] 成功支付 {amount} 元");
}

// 3. 高层业务类仅依赖抽象(开闭原则 OCP:未来新增 ApplePay 仅需新建类,无需修改此类)
public class PaymentService
{
    private readonly IPaymentStrategy _paymentStrategy;

    // 依赖注入
    public PaymentService(IPaymentStrategy paymentStrategy)
    {
        _paymentStrategy = paymentStrategy;
    }

    public void ExecutePayment(decimal amount)
    {
        _paymentStrategy.Pay(amount);
    }
}