设计模式-六大基本原则

以下是 设计模式的六大基本原则(SOLID + 迪米特法则)及其核心原理、应用案例,它们是构建可维护、可扩展软件系统的基石:


一、单一职责原则(Single Responsibility Principle, SRP)

原理

一个类(或模块)应仅有一个引起变化的原因。
核心思想:高内聚,避免“上帝类”。

应用案例
  • 订单处理系统
    // 错误:一个类处理订单、日志、支付
    class OrderService {
        void createOrder() { /*...*/ }
        void logOrder() { /*...*/ }
        void processPayment() { /*...*/ }
    }
    
    // 正确:拆分职责
    class OrderService { void createOrder() { /*...*/ } }
    class OrderLogger { void logOrder() { /*...*/ } }
    class PaymentProcessor { void processPayment() { /*...*/ } }
    

二、开闭原则(Open/Closed Principle, OCP)

原理

软件实体应对扩展开放,对修改关闭。
核心思想:通过抽象和继承实现扩展,而非修改源码。

应用案例
  • 支付方式扩展
    interface Payment {
        void pay(double amount);
    }
    class CreditCardPayment implements Payment { /*...*/ }
    class PayPalPayment implements Payment { /*...*/ }
    
    class PaymentProcessor {
        public void processPayment(Payment payment, double amount) {
            payment.pay(amount); // 新增支付方式无需修改此类
        }
    }
    

三、里氏替换原则(Liskov Substitution Principle, LSP)

原理

子类必须能够替换其父类,且不影响程序正确性。
核心思想:继承关系应确保行为兼容性。

应用案例
  • 几何图形计算
    // 错误:正方形继承长方形,重写 setWidth/setHeight 破坏行为
    class Rectangle { void setWidth(int w) { /*...*/ } }
    class Square extends Rectangle { 
        void setWidth(int w) { super.setWidth(w); super.setHeight(w); } // 违反 LSP
    }
    
    // 正确:通过接口定义独立行为
    interface Shape { double area(); }
    class Rectangle implements Shape { /*...*/ }
    class Square implements Shape { /*...*/ }
    

四、接口隔离原则(Interface Segregation Principle, ISP)

原理

客户端不应依赖它不需要的接口。
核心思想:避免臃肿接口,按需拆分。

应用案例
  • 多功能设备接口拆分
    // 错误:多功能接口
    interface MultiFunctionDevice {
        void print();
        void scan();
        void fax();
    }
    
    // 正确:按功能拆分
    interface Printer { void print(); }
    interface Scanner { void scan(); }
    interface FaxMachine { void fax(); }
    
    class BasicPrinter implements Printer { /*...*/ }
    class AdvancedCopier implements Printer, Scanner { /*...*/ }
    

五、依赖倒置原则(Dependency Inversion Principle, DIP)

原理

高层模块不应依赖低层模块,二者都应依赖抽象。
核心思想:面向接口编程,解耦模块依赖。

应用案例
  • 数据库访问层解耦
    interface Database {
        void saveData(String data);
    }
    class MySQLDatabase implements Database { /*...*/ }
    class MongoDBDatabase implements Database { /*...*/ }
    
    class DataService {
        private Database database; // 依赖抽象
        public DataService(Database database) {
            this.database = database; // 依赖注入
        }
        public void process(String data) {
            database.saveData(data);
        }
    }
    

六、迪米特法则(Law of Demeter, LoD)

原理

一个对象应尽可能少地与其他对象发生交互。
核心思想:减少耦合,避免“链式调用”。

应用案例
  • 订单系统设计
    // 错误:直接访问深层对象
    Order order = customer.getOrder();
    Address address = order.getShippingAddress();
    String city = address.getCity();
    
    // 正确:封装方法
    class Customer {
        public String getShippingCity() {
            return this.order.getShippingAddress().getCity();
        }
    }
    String city = customer.getShippingCity();
    

总结:原则对比与适用场景

原则 原则详解 核心目标 典型应用场景
单一职责原则 (SRP) https://blog.csdn.net/dalinsi/article/details/148696654?spm=1001.2014.3001.5501 高内聚 模块拆分、微服务设计
开闭原则 (OCP) https://blog.csdn.net/dalinsi/article/details/148696639?spm=1001.2014.3001.5501 扩展性 插件架构、策略模式
里氏替换原则 (LSP) https://blog.csdn.net/dalinsi/article/details/148696621?spm=1001.2014.3001.5501 继承安全 多态设计、接口实现
接口隔离原则 (ISP) https://blog.csdn.net/dalinsi/article/details/148696615?spm=1001.2014.3001.5501 简化依赖 大型系统接口设计
依赖倒置原则 (DIP) https://blog.csdn.net/dalinsi/article/details/148696482?spm=1001.2014.3001.5501 解耦 依赖注入、Spring 框架
迪米特法则 (LoD) https://blog.csdn.net/dalinsi/article/details/148696831?spm=1001.2014.3001.5501 低耦合 模块化设计、API 封装

最佳实践建议

  1. 适度原则:避免过度设计,在灵活性与复杂度间平衡。
  2. 结合模式:将原则与设计模式(如工厂、观察者)结合使用。
  3. 代码审查:通过 Code Review 检查原则遵循情况。

掌握这些原则,能显著提升代码质量,构建易于维护和扩展的软件系统!

你可能感兴趣的:(设计模式)