美文网首页java
实用的设计模式-双分派模式

实用的设计模式-双分派模式

作者: 恏人_7d7c | 来源:发表于2020-08-14 15:47 被阅读0次

双向分派模式-java版实现

原创 一个man 一个man 今天

先聊聊动态绑定和静态绑定

动态绑定

动态绑定是指程序在运行期判断引用的对象实际类型,根据实际的类型调用其相对应的方法。

public class DynamicBinding {

public static void main(String[] args) {

Animal dog = new Dog();

Animal cat = new Cat();

dog.talk();

cat.talk();

  }

}

class Animal{

public void talk(){}

}

class Dog extends Animal{

public void talk(){System.out.println("dog talk...汪汪");}

}

class Cat extends Animal{

public void talk(){System.out.println("cat talk...喵喵");}

}

静态绑定

静态绑定是在编译期就已经确认了执行那个方法,方法重载(方法名相同参数列表不同)就是静态绑定,重载时执行哪一个方法在编译期就已经确定了。

public class DynamicBinding {

public static void main(String[] args) {

OutputName out = new OutputName();

Person p = new Person();

Person man = new Man();

Person woman = new Woman();

out.print(p);

out.print(man);

out.print(woman);

  }

}

class Person {

}

class Man extends Person {

}

class Woman extends Person {

}

class OutputName {

void print(Person p) {

System.out.println("person");

  }

void print(Man m) {

System.out.println("man");

  }

void print(Woman w) {

System.out.println("woman");

  }

}

不管传入的对象实际是什么类型都会执行print(Person p)这个方法,所以重载是静态绑定。

如果希望使用重载的时候,程序能够根据传入参数的实际类型动态地调用相应的方法,只能通过instanceof操作符进行类型的判断,然后再进行调用。虽然可以解决问题,但是如果子类数目很多,那么就要写很过个if else来判断类型,显然不是这种解决方案不是很合适。

双分派

分派( dispatch)是指运行环境按照对象的实际类型为其绑定对应方法体的过程。

double dispatch(双分派)在选择一个方法的时候,不仅仅要根据消息接收者(receiver) 的运行时型别(Run time type),还要根据参数的运行时型别(Run time type)。这里的消息接收者其实就是方法的调用者。具体来讲就是,对于消息表达式a.m(b),双分派能够按照a和b的实际类型为其绑定对应方法体。

public class DynamicBinding {

public static void main(String[] args) {

Father father = new Father();

Father s1 = new Son1();

Father s2 = new Son2();

Execute exe = new Execute();

father.accept(exe);

s1.accept(exe);

s2.accept(exe);

  }

}

class Father {

public void accept(Execute exe) {

exe.method(this);

  }

}

class Son1 extends Father {

@Override

public void accept(Execute exe) {

exe.method(this);

  }

}

class Son2 extends Father {

@Override

public void accept(Execute exe) {

exe.method(this);

  }

}

class Execute {

public void method(Father father) {

System.out.println("This is Father's method");

  }

public void method(Son1 son) {

System.out.println("This is Son1's method");

  }

public void method(Son2 son) {

System.out.println("This is Son2's method");

  }

}

双分派模式下,无形中没有了繁琐的if。。else,在面向对象的思想下,程序变得更加的利于拓展。

写到最后

过程式代码难以添加新的数据结构,因为如果要添加新的数据结构就必须要修改所有函数;面向对象代码难以添加新的函数,因为如果要添加新的函数就必须修改所有的类。

[代码简洁之道]  第六章-对象和数据结构

相关文章

  • 实用的设计模式-双分派模式

    双向分派模式-java版实现 原创一个man一个man今天 先聊聊动态绑定和静态绑定 动态绑定 动态绑定是指程序在...

  • 设计模式--访问者模式

    目录 本文的结构如下: 引言 什么是访问者模式 模式的结构 典型代码 访问者模式中的伪动态双分派 代码示例 访问者...

  • 文章精选

    盒饭君带你一稿设计适配双端 设计模式-单例模式

  • 行为型模式(五):命令模式

    命令模式属于23种设计模式中行为模式中的一个,它也是一种简单实用非常普遍的设计模式。首先看下GOF对命令模式的定义...

  • 69 - 访问者模式 & 双分派

    讲到访问者模式,大部分书籍或者资料都会讲到 Double Dispatch,中文翻译为双分派。虽然学习访问者模式,...

  • 设计模式-桥接模式

    原文地址:LoveDev 桥接模式是种很实用的结构型设计模式,又称为柄体模式或接口模式,该模式可以将两个维度的变化...

  • 设计模式之工厂模式

    设计模式之工厂模式 标签(空格分隔): 设计模式 工厂模式 设计模式的感念 设计模式的应用 工厂设计模式的产生 工...

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

  • 前端设计模式

    JS设计模式一:工厂模式jS设计模式二:单例模式JS设计模式三:模块模式JS设计模式四:代理模式JS设计模式五:职...

  • 设计模式 - 目录

    设计模式01 - 单例模式 设计模式02 - 工厂模式 设计模式03 - 建造者模式 设计模式04 - 适配器模式...

网友评论

    本文标题:实用的设计模式-双分派模式

    本文链接:https://www.haomeiwen.com/subject/kiggdktx.html