设计模式

设计模式的目的是解耦,为了程序的灵活性。

# 概述

设计模式能有效提高代码的可读性、可重用性和可靠性,便于后续维护。

但设计模式也不是万能仙丹,对于简单的功能,使用设计模式反倒增加了代码的复杂性。

# 七原则(高内聚、低耦合)

设计模式有 7个原则:单一职责原则、开闭原则、里氏代换原 则、依赖倒转原则、接口隔离原则、合成/聚合复用原则、迪米特法则

  1. 单一职责原则 单一职责原则又称单一功能原则,它规定一个类只有一个职责。 如果有多个职责(功能)被设计在一个类中,这个类就违反了单一职责原则。

  2. 开闭原则 开闭原则规定软件中的对象(类、模块、函数等)对扩展开放, 对修改封闭,这意味着一个实体允许在不改变其源代码的前提下改变 其行为,该特性在产品化的环境下是特别有价值的,在这种环境下, 改变源代码需要经过代码审查、单元测试等过程,以确保产品的使用 质量。遵循这个原则的代码在扩展时并不发生改变,因此不需要经历上述过程。

  3. 里氏代换原则 里氏代换原则是对开闭原则的补充,规定了在任意父类可以出现 的地方,子类都一定可以出现。实现开闭原则的关键就是抽象化,父 类与子类的继承关系就是抽象化的具体表现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

  4. 依赖倒置原则 依赖倒转原则指程序要依赖于抽象(Java中的抽象类和接口), 而不依赖于具体的实现(Java中的实现类)。简单地说,就是要求对抽象进行编程,不要求对实现进行编程,这就降低了用户与实现模块之间的耦合度。

  5. 接口隔离原则 接口隔离原则指通过将不同的功能定义在不同的接口中来实现接 口的隔离,这样就避免了其他类在依赖该接口(接口上定义的功能)时依赖其不需要的接口,可减少接口之间依赖的冗余性和复杂性。

  6. 合成/聚合复用原则 合成/聚合复用原则指通过在一个新的对象中引入(注入)已有的 对象以达到类的功能复用和扩展的目的。它的设计原则是要尽量使用合成或聚合而不要使用继承来扩展类的功能。

  7. 迪米特法则(最小知识原则) 迪米特法则指一个对象尽可能少地与其他对象发生相互作用,即 一个对象对其他对象应该有尽可能少的了解或依赖。其核心思想在于 降低模块之间的耦合度,提高模块的内聚性。迪米特法则规定每个模 块对其他模块都要有尽可能少的了解和依赖,因此很容易使系统模块 之间功能独立,这使得各个模块的独立运行变得更简单,同时使得各个模块之间的组合变得更容易

# 23中设计模式

设计模式按照其功能和使用场景可以分为三大类:创建型模式 (Creational Pattern)、结构型模式(Structural Pattern)和行为型模式(Behavioral Pattern)。

# 工厂模式

工厂模式输出的对象,可以是类的实例,也可以是接口的实例。

Spring Cloud Gateway 中的 RequestRateLimiterGatewayFilterFactory,就使用了工厂模式,并且输出结果的类型是接口。

@ConfigurationProperties("spring.cloud.gateway.filter.request-rate-limiter")
public class RequestRateLimiterGatewayFilterFactory extends
		AbstractGatewayFilterFactory<RequestRateLimiterGatewayFilterFactory.Config> {

    /**
     * GatewayFilter是一个接口,而非一个类
     */
    @Override
    public GatewayFilter apply(Config config) {
        // ...
        // 以匿名内部类的方式返回了所需的对象(使用Java8的Lambda表达式简化)
        return (exchange, chain) -> resolver.resolve(exchange).defaultIfEmpty(EMPTY_KEY)
                .flatMap(key -> {
                    // ...
                    return limiter.isAllowed(routeId, key).flatMap(response -> {
                        // ...
                        return exchange.getResponse().setComplete();
                    });
                });
    }
}
Last Updated: 4 days ago