耦合性:费书记控制外部公共内容

图片引用出处 https://ebook.qicoder.com/%E8%BD%AF%E4%BB%B6%E8%AE%BE%E8%AE%A1%E5%B8%88/notes/2021%E5%B9%B4%E4%B8%8A%E5%8D%8A%E5%B9%B4%E8%BD%AF%E8%AE%BE%E8%80%83%E8%AF%95%E4%B8%8A%E5%8D%88%E7%9C%9F%E9%A2%98.html?h=%E7%80%91%E5%B8%83%E6%A8%A1%E5%9E%8B#%E7%AC%AC-27-%E9%A2%98

bcqyzfNYq6


耦合度的层次

特别注意: 控制参数≠数据

🧩 耦合度从低到高 — Java 小例子讲透

🏝️ 非直接耦合(No Coupling)

模块之间互不依赖,互不认识,和平共处。

class Logger {
    void log(String msg) {
        System.out.println(msg);
    }
}

class Calculator {
    int add(int a, int b) {
        return a + b;
    }
}

// main 只是分别调用
public class Demo {
    public static void main(String[] args) {
        Logger logger = new Logger();
        Calculator calc = new Calculator();
        logger.log("结果: " + calc.add(2, 3));
    }
}

🔹 耦合最低,互相毫无关系,靠 main 串联。


📦 数据耦合(Data Coupling)

模块只传递必要的参数,互不窥探对方内部。

class Calculator {
    int add(int a, int b) {
        return a + b;
    }
}

class Printer {
    void printResult(int result) {
        System.out.println("结果: " + result);
    }
}

🔹 推荐,模块间只传递简单数据,独立性强。


📑 标记耦合(Stamp Coupling / 数据结构耦合)

模块传递包含多字段的对象,但对方只用其中一部分。

class Data {
    int x;
    int y;
}

class Calculator {
    int add(Data d) {
        return d.x + d.y;
    }
}

🔹 结构一改,全体模块要跟着改,有潜在连锁反应


🎛️ 控制耦合(Control Coupling)

模块传递控制参数告诉对方“怎么做”。

class Processor {
    void process(int a, int b, boolean doAdd) {
        if (doAdd) System.out.println(a + b);
        else System.out.println(a - b);
    }
}

🔹 传递的是行为指令,模块内部逻辑被外部控制,耦合升高


🌐 外部耦合(External Coupling)

模块依赖外部资源(文件、设备、通信协议、数据库、网络等)

import java.nio.file.*;

class FileReader {
    String read(String path) throws Exception {
        return Files.readString(Path.of(path));
    }
}

🔹 外部变化就会影响模块,环境依赖重


⚠️ 公共耦合(Common Coupling)

模块通过共享全局变量/公共数据区交流。

class Global {
    static int counter = 0;
}

class ModuleA {
    void run() {
        Global.counter++;
    }
}

class ModuleB {
    void run() {
        System.out.println(Global.counter);
    }
}

🔹 谁都能改,谁都能读,调试地狱模式


💣 内容耦合(Content Coupling)

模块直接操作另一个模块的内部实现(最危险)。

class Secret {
    int hidden = 42;
}

class Hacker {
    void hack(Secret s) {
        s.hidden = 99; // 直接改内部
    }
}

🔹 最强耦合,破坏封装性,牵一发而动全身。


练习

image-20250902215044235


image-20250914094727281