软件设计笔记(二) : 软件设计原则
一个自用的软件设计笔记。

开闭原则 (Open/Closed Principle)

定义:软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。

说明:通过使用接口和抽象类,可以在不修改现有代码的情况下扩展功能。

示例

// 基础接口
interface Shape {
    double area();
}

// 扩展类:圆
class Circle implements Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    public double area() {
        return Math.PI * radius * radius;
    }
}

// 扩展类:矩形
class Rectangle implements Shape {
    private double width, height;

    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    public double area() {
        return width * height;
    }
}

// 使用新的形状时不需要修改已有代码

单一职责原则 (Single Responsibility Principle)

定义:一个类应该只有一个引起其变化的原因。

说明:每个类都应该负责单一的功能。

示例

// 职责:处理用户数据
class UserDataService {
    public void saveUserData(User user) {
        // 保存用户数据
    }
}

// 职责:发送通知
class NotificationService {
    public void sendEmail(User user) {
        // 发送电子邮件
    }
}

接口隔离原则 (Interface Segregation Principle)

定义:客户端不应该被强迫依赖于它不使用的方法。

说明:设计接口时,应尽量精简。

示例

interface Printer {
    void printDocument();
}

interface Scanner {
    void scanDocument();
}

// 实现打印功能的类
class SimplePrinter implements Printer {
    public void printDocument() {
        // 打印文档
    }
}

// 实现扫描功能的类
class SimpleScanner implements Scanner {
    public void scanDocument() {
        // 扫描文档
    }
}

里氏替换原则 (Liskov Substitution Principle)

定义:子类对象能够替换父类对象,并且程序行为保持不变。

说明:子类不应改变父类的方法行为。

示例

class Bird {
    public void fly() {
        System.out.println("Flying");
    }
}

class Sparrow extends Bird {
    // 继续保持飞行行为
}

class Penguin extends Bird {
    // 不用重写fly方法,以免违反里氏替换原则
    public void swim() {
        System.out.println("Swimming");
    }
}

依赖倒置原则 (Dependency Inversion Principle)

定义:高层模块不应该依赖于低层模块,二者都应该依赖于抽象。

说明:依赖接口或抽象类,而不是具体的类。

示例

interface Keyboard {
    void type();
}

class MechanicalKeyboard implements Keyboard {
    public void type() {
        System.out.println("Typing on mechanical keyboard");
    }
}

class Computer {
    private Keyboard keyboard;

    public Computer(Keyboard keyboard) {
        this.keyboard = keyboard;
    }

    public void type() {
        keyboard.type();
    }
}

// 高层模块 (Computer) 依赖于抽象 (Keyboard) 而不是具体的类

合成复用原则 (Composition over Inheritance)

定义:优先使用组合而不是继承来实现功能复用。

说明:通过组合多个功能模块来实现新的功能。

示例

class Engine {
    public void start() {
        System.out.println("Engine starting");
    }
}

class Car {
    private Engine engine;

    public Car(Engine engine) {
        this.engine = engine;
    }

    public void start() {
        engine.start();
    }
}

// 使用组合而不是继承来实现Car的功能

迪米特法则 (Law of Demeter)

定义:一个对象应当对其他对象有尽可能少的了解。

说明:减少类之间的耦合,提高模块的独立性。

示例

class Wheel {
    public void rotate() {
        System.out.println("Wheel rotating");
    }
}

class Car {
    private Wheel wheel = new Wheel();

    public void drive() {
        wheel.rotate(); // 只与自己的组件交互
    }
}

最后修改于 2024-06-02