设计模式--第二十八章 回调机制

第一章 前言
第二章 观察者模式
第三章 状态模式
第四章 中介模式
第五章 装饰器模式
第六章 单例模式
第七章 克隆模式
第八章 职责链模式
第九章 代理模式
第十章 外观模式
第十一章 迭代模式
第十二章 组合模式
第十三章 构建模式
第十四章 适配模式
第十五章 策略模式
第十六章 简单工厂模式
第十七章 工厂方法模式
第十八章 抽象工厂模式
第十九章 命令模式
第二十章 备忘录模式
第二十一章 享元模式
第二十二章 访问模式
第二十三章 模板模式
第二十四章 桥接模式
第二十五章 解释器模式
第二十六章 过滤器模式
第二十七章 对象池技术
第二十八章 回调机制
第二十九章 MVC模式
附录



1. 核心思想

把函数作为参数,传递给另一个函数,延迟到另一个函数的某个时刻执行的过程叫回调。假设我们有一个函数callback(args)这个函数可以作为参数传递给另一个函数otherFun(fun,args),如otherFun(callback, [1, 2, 3]),那么callback叫回调函数,otherFun叫高阶函数,也叫包含(调用)函数。

回调函数属于函数式编程,也就是面向过程编程。在面向对象编程中,如何实现这种机制呢?特别是那些不支持函数作为参数来传递的语言(如Java),可以使用策略模式实现回调机制。

2. UML类图

回调模式UML类图

3. 框架代码

from abc import ABC,abstractmethod
import sys

class Strategy(ABC):
    @abstractmethod
    def alogrithm(self, *args, **kwargs):
        pass

class StrategyImplA(Strategy):
    def alogrithm(self, *args, **kwargs):
        print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name} is running...")

class StrategyImplB(Strategy):
    def alogrithm(self, *args, **kwargs):
        print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name} is running...")

class Context:
    def interface(self, strategy:Strategy, *args, **kwargs):
        print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name} before callback...")
        strategy.alogrithm(*args, **kwargs)
        print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name} after callback...")

if __name__ == "__main__":
    c = Context()
    c.interface(StrategyImplA())
    print("*"*50)
    c.interface(StrategyImplB())

4. 模型说明

4.1 设计要点

在设计回调机制的程序时要注意以下几点:

  1. 在支持函数式编程的语言中,可以使用回调函数实现。作为参数传递的函数称为回调函数,接收回调函数(参数)的函数称为高阶函数或包含函数。
  2. 在只支持面向对象编程的语言中,可以使用策略模式来实现回调机制。

4.2 优缺点

  1. 优点
    • 避免重复代码。
    • 增强代码的可维护性。
    • 有更多定制的功能。
  2. 缺点
    • 可能出现“回调地狱”的问题,即多重的回调函数调用。如回调函数A被高阶函数B调用,同时B本身又是一个回调函数,被函数C调用。我们应尽量避免这种多重调用的情况,否则代码的可读性很差,程序将很难维护。

5. 应用场景

  1. 在第三方库和框架中;
  2. 异步执行(例如读文件、发送HTTP请求);
  3. 在需要更多通用功能的地方,更好地实现抽象(可处理各种类型的函数);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值