派(Dispatch)
单派与多派
(Single Dispatch and Multi Dispatch)
"检查一个数据项的类型,并据此去调用某个适当的过程称为基于类型的分派"。
上面是来自《计算机程序的解释与构造》的一段话,今日有幸读到。对于Dispatch这个词,我第一次接触,是来自Com/DCom年代的自动化接口(IDispatcher),然后一直就很朦胧,知道那么会事,但是没有一个清晰的认识。
OOP中的多态就属于典型的单分派,对一个多态方法的调用是通过对象的实际类型确定的。
对于如下代码调用:
IObj a = new ObjA();
IObj b = new ObjB();
IObj c = new ObjC();
a.Func();
b.Func();
c.Func();
虽然同样是对Func的调用,但是其分别"检查了a,b,c的实际类型,并据此去调用某个对应的方法",为什么是叫单派,因为参与确定方法的因素只有一个,就是类型。
确定具体方法的只需要查询这个一维表格,而双派的典型应用就是设计模式中的访问者模式。
下面是一个典型的访问模式的结构图:
访问者模式要确定调用哪个方法,需要有两个维度来确定,一个维度是结构,包含ObjA,ObjB,ObjC,一个维度是行为,包括VisA,VisB,VisC。
如下调用:
IObj obj = new ObjB();
IVis func = new VisB();
obj.Accept(func);
如上表格,确定最后调用哪个方法,有两个维度决定调用VisB::Do(ObjB),同理,如下调用:
IObj obj = new ObjC();
IVis func = new VisA();
obj.Accept(func);
我能想到的应用也只有双派,是否有更多的派,我就不了解了。
派(Dispatch)的更多相关文章
- IOS学习之十七:Grand Central Dispatch(GCD)编程基础
IOS学习之十七:Grand Central Dispatch(GCD)编程基础 有过编程经验的人,基本都会接触到多线程这块. 在java中以及Android开发中,大量的后台运行,异步消息队列, ...
- 转 Grand Central Dispatch 基础教程:Part 1/2 -swift
本文转载,原文地址:http://www.cocoachina.com/ios/20150609/12072.html 原文 Grand Central Dispatch Tutorail for S ...
- iOS开发之再探多线程编程:Grand Central Dispatch详解
Swift3.0相关代码已在github上更新.之前关于iOS开发多线程的内容发布过一篇博客,其中介绍了NSThread.操作队列以及GCD,介绍的不够深入.今天就以GCD为主题来全面的总结一下GCD ...
- Double Dispatch讲解与实例-面试题
引言 说实话,我看过GoF<Design Patterns>,也曾深深的被李建忠<设计模式>系列Webcast吸引.但是还没有见过“Double Dispatch模式”.的确G ...
- usr/include/dispatch - dispatch_source
博文一部分摘自:Parse分析,以下简称博文1(LeanCloud工程师针对Parse使用GCD的分析) 博文一部分摘自:GCD入门,以下简称博文2 建议先了解一下:BSD基础知识 在Dispatch ...
- dispatch a action with a timeout
程序入口文件添加依赖: import { createStore, applyMiddleware } from 'redux' import thunk from 'redux-thunk' // ...
- GCD: 基本概念和Dispatch Queue 【转】
什么是GCD? Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写.从基本功能上讲,GCD有点像 NSOperationQueue,他们都允 ...
- GCD、dispatch函数介绍
iOS多线程的方法有3种: NSThread NSOperation GCD(Grand Central Dispatch) 其中,由苹果所倡导的为多核的并行运算提出的解决方案:GCD能够访问线程池, ...
- 装个蒜。学习下dispatch queue
dispatch queue的真髓:能串行,能并行,能同步,能异步以及共享同一个线程池. 接口: GCD是基于C语言的APT.虽然最新的系统版本中GCD对象已经转成了Objective-C对象,但AP ...
随机推荐
- ES6数组的扩展运算符
一.基本使用 ES6中函数可以使用 rest参数 接收函数的多余参数,组成一个数组,放在形参的最后面. let fn = (a, ...value) => { console.log(a); c ...
- python 面试题(2)
1.Python是如何进行内存管理的? 答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制 一.对象的引用计数机制 Python内部使用引用计数,来保持追踪内存中的对象,所有对象都 ...
- SPOJ AMR11E Distinct Primes 基础数论
Arithmancy is Draco Malfoy's favorite subject, but what spoils it for him is that Hermione Granger i ...
- select + 回调 + 事件循环
#1. epoll并不代表一定比select好 # 在并发高的情况下,连接活跃度不是很高, epoll比select # 并发性不高,同时连接很活跃, select比epoll好 #通过非阻塞io实现 ...
- Spring Web 项目Junit测试报错问题
测试对象是Web项目的Service类,参照网上查到的资料,按如下方式执行时报错, //使用junit4进行单元测试 @RunWith(SpringJUnit4ClassRunner.class) / ...
- SSM三大框架整合详细总结(Spring+SpringMVC+MyBatis)(山东数漫江湖)
使用 SSM ( Spring . SpringMVC 和 Mybatis )已经很久了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方.之前没有记录 ...
- python keras YOLOv3实现目标检测
1.连接 https://www.jianshu.com/p/3943be47fe84
- sqlserver 树形结构表查询 获取拼接结果
树形表结构如下 IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[Test]') AND ty ...
- Perl6 Bailador框架(6):获取用户输入
use v6; use Bailador; get '/' => sub { ' <html> <head><title></title>< ...
- English——Unit 1
meditate v.沉思,冥想:考虑,谋划 medtiation n.沉思,冥想:深思熟虑 medium elaborate adj.精心制作的,详尽的,复杂的:v.精心制作:详述(计划, ...