【双分派小结】

双分派(Double Dispatch)是一种面向对象编程中的设计模式,通常用于实现多态性,尤其是在涉及多个对象交互时。它的基本思想是通过两个不同的对象来确定方法调用,而不仅仅是依赖于一个对象。

双分派的工作原理

在普通的单分派中,方法的调用是由一个对象的类型决定的,而在双分派中,方法的调用由两个对象的类型共同决定。这通常发生在需要在多个对象之间进行交互时,例如在访问者模式(Visitor Pattern)中。

双分派的步骤

  1. 第一个分派:由调用方对象的类型决定调用哪个方法。
  2. 第二个分派:在调用方法时,方法内部可能会调用另一个对象的方法,而这个方法的选择又依赖于另一个对象的类型。

举个例子

假设有两个类:Shape(形状)和Visitor(访问者)。Shape类有多个子类(例如CircleRectangle),Visitor类有多个实现(例如AreaCalculatorPerimeterCalculator)。

java 复制代码
interface Shape {
    void accept(Visitor visitor);
}

class Circle implements Shape {
    void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

class Rectangle implements Shape {
    void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

interface Visitor {
    void visit(Circle circle);
    void visit(Rectangle rectangle);
}

class AreaCalculator implements Visitor {
    void visit(Circle circle) {
        System.out.println("Calculating area of Circle");
    }
    void visit(Rectangle rectangle) {
        System.out.println("Calculating area of Rectangle");
    }
}

在这个例子中:

  • 第一次分派 :通过调用circle.accept(visitor)来触发Shapeaccept方法。
  • 第二次分派 :在accept方法中,实际调用的是visitor.visit(this),而visitor的方法调用则取决于CircleRectangle的类型。

为什么需要双分派

双分派的优势在于:

  1. 可以根据不同类型的对象(不仅是调用者,还包括被调用者)选择合适的方法执行,增强了灵活性和扩展性。
  2. 它支持更复杂的动态行为,例如不同对象之间的交互,避免了硬编码的类型判断。

在实践中,双分派常用于访问者模式状态模式等设计模式中,用来解耦对象间的操作逻辑,使得代码更具扩展性和可维护性。

相关推荐
杨充18 小时前
10.可测试性实战设计
设计模式·开源·代码规范
杨充18 小时前
9.重构十二式的实战
设计模式·开源·代码规范
杨充18 小时前
6.设计原则的全景图
设计模式·开源·全栈
杨充18 小时前
2.面向对象的特性
设计模式
杨充18 小时前
7.SOLID原则案例汇
设计模式·开源·全栈
杨充18 小时前
8.反模式与坏味道
设计模式·开源·代码规范
杨充18 小时前
3.接口vs抽象类比较
设计模式
咖啡八杯21 小时前
文法、BNF与AST
java·设计模式·解释器模式·ast·文法
咖啡八杯1 天前
GoF设计模式——解释器模式
java·后端·spring·设计模式