zoukankan      html  css  js  c++  java
  • java 的 callback

    Java 本身没有回调这一说,但是面向对象可以模拟出来。

    1. 回调接口对象 ICommand

    package com.git.Cmder;
    
    public interface ICommand {
        void execute(); // 1. Think in callback, void (*)pf()
    }

    2. 回调对象关联哪些,这个就是 c 中的 pf 赋值

    package com.git.Cmder;
    /*
        将 command 和 receive 关联起来
     */
    public class ConcreteCommand implements ICommand {
        Receiver receiver;  // // 1. Think in callback, func
    
        public void setReceiver(Receiver receiver) {
            this.receiver = receiver; // // 1. Think in callback , pf = func
        }
    
        public void execute() {
            receiver.action();  // 1. Think in callback, call func
        }
    }

    3. 关联对象 pf 的具体实现

    package com.git.Cmder;
    
    public class Receiver {
        public void action(){ // 1. Think in callback, func 的内容
            /* 具体做的工作 */
            System.out.println("Receiver Do.");
        }
    }

    4. cb 的注册和调用封成一个对象 Invoker

    package com.git.Cmder;
    /*
        调用者, 业务接口层
     */
    public class Invoker {  
        private ICommand iCommand;
        // 1. Think in callback, cb 的入口, register
        /* 这里传子类过来,就调用子类的方法 */
        public void setiCommand(ICommand iCommand) {
            this.iCommand = iCommand;
        }
    
        // 1. Think in callback, cb 的入口, call
        public void action(){
            iCommand.execute();
        }
    }

    5. 测试

    package com.git.Cmder;
    
    public class Client {
        public static void main(String[] args) {
            Receiver receiver = new Receiver(); // 真实的工作者
    
            ConcreteCommand command = new ConcreteCommand(); // 2, 这里主要用的是 子类实现,调用子类的方法,接口定义的是父类,这样所有的子类都可以用了
    
            command.setReceiver(receiver); // 2.1
            Invoker invoker = new Invoker(); // 1
            invoker.setiCommand(command);  // 1.1
            invoker.action();
        }
    }

    这里主要用父子类的关系来实现,定义一个cb 对象,对象包含一个父类接口对象,和"父类接口对象的调用", 用语言本身的提供的多态特性(其实内存中的地址还是一个), 不同的子类有不同的实现, cb 对象可以看做 n 个方法的管理者,当你传入一个子对象,调用其方法,说了半天还是一个 key-val ,只不过管理者由程序员自己来管理了。

  • 相关阅读:
    班课2
    班课2
    班课1
    lecture 2
    lecture 1
    使用node的fs读取文件
    使用Node.js搭建一个本地服务器
    Node.js前言
    简述ES6其他的东西
    ES6异步操作Thunk、co和async
  • 原文地址:https://www.cnblogs.com/ashen/p/12389341.html
Copyright © 2011-2022 走看看