回调监听机制详解

来源:互联网 发布:汉娜.穆雷 知乎 编辑:程序博客网 时间:2024/05/21 09:49

一、回调机制的理解


回调监听实例需求:领导需要员工帮忙做一件事情,做完以后告诉他。这件事情的执行,是需要消耗时间的,领导不能在这里等待着。所以需要,在事情执行完后给领导一个反馈。

在编码实现中,耗时操作则需要回调监听。

领导:需要一个做事的员工,安排任务,携带回传信息途径 ---- 员工,任务,回传途径;

员工:做事情,回传消息 ---- 需要:事情,回传;输出:事情结果。


领导:

public class Manager {    /**     * @param personal 传入一个员工类的对象     */    public Manager(Personal personal) {        // 想让该让员工做什么        personal.doSomething(this, "整理公司文件");    }    /**     * @param result 事情结果     * @description 当员工做完总经理让他做的事后就通过该方法通知总经理     */    public void phoneCall(String result) {        System.out.println("事情" + result);    }}


员工:

public class Personal {    public void doSomething(Manager manager, String task) {        // 总经理通过doSomething方法告诉员工要做什么        System.out.println("总经理要你做" + task);        String result = "做完了";        // 当事情做完了我们就通过总经理公布的phoneCall方法通知总经理结果        manager.phoneCall(result);    }}

事情开始执行:

public class MyClass {    public static void main(String[] args) {        // 首先我们需要一个员工        Personal personal = new Personal();        // 其次把这个员工指派给总经理        new Manager(personal);    }}

任务执行过程中,领导把自己“备份”跟着员工,在现实中是不可能出现的,最多给一个“手机”。在程序中,将领导备份也是相对较耗资源的。
现实很明显,一个员工不只是一个领导,很多领导需要这个员工做不同的事情,但是反馈内容大致相差不多。

二、回调机制的实现一


应用JAVA接口机制,先把汇报工作模式化下来。

public interface CallBackSameInfoInterface {    /**     * 返回信息结果     *     * @param result     */    public void sendBackInfo(String result);}


员工需要做不同领导派发的任务:信息回传都使用我们模式化的汇报形式。


public class Worker {    /**     * 做经理一安排的工作     *     * @param manager1     * @param manager1Task     */    public void doManager1Job(CallBackSameInfoInterface manager1, String manager1Task) {        System.out.println("Worker" + manager1Task);        manager1.sendBackInfo("经理一的工作做完了。");    }    /**     * 做经理二安排的工作     *     * @param manager2     * @param manager2Task     */    public void doManager2Job(CallBackSameInfoInterface manager2, String manager2Task) {        System.out.println("Worker" + manager2Task);        manager2.sendBackInfo("经理二的工作做完了。");    }}

领导一出来安排工作了:

public class Manager1 implements CallBackSameInfoInterface {    public Manager1(Worker worker) {        worker.doManager1Job(this, "经理一要咖啡!");    }    @Override    public void sendBackInfo(String result) {        System.out.println(result + "咖啡很好喝!");    }}

领导二也出来安排工作了:

public class Manager2 implements CallBackSameInfoInterface {    public Manager2(Worker worker) {        worker.doManager2Job(this, "经理二要一杯茶!");    }    @Override    public void sendBackInfo(String result) {        System.out.println(result + "茶很不错~");    }}



当前机制下,领导并没有把自己“备份”,而是将“手机号”给了员工,也同样实现了消息回调。


在现实中,领导安排了不同的任务,回馈的消息当然并不一致。诱发了新的变化与需求。


三、回调机制的实现二


消息回馈不同,则需要不同的回馈模型。而同一个任务执行只需要回馈自己任务的消息。接口的强制子类重写方法则需要变更一下。
准备消息回馈模型:


public class CallBackDifferentInfoInterface {    /**     * 返回信息结果     *     * @param result     */    public void sendBackInfo(boolean result) {    }    /**     * 返回最终数量     *     * @param result     */    public void sendBackNumber(float result) {    }}

吃苦受累的员工还是需要干活的。因为要回馈给不同的人,所以,给我电话号码的时候,就做好区分,可行?!


public class Worker {    /**     * 做经理一安排的工作     *     * @param manager1     * @param manager1Task     */    public void doManager1Job(CallBackDifferentInfoInterface manager1, String manager1Task) {        System.out.println("Worker" + manager1Task);        manager1.sendBackInfo(true);    }    /**     * 做经理二安排的工作     *     * @param manager2     * @param manager2Task     */    public void doManager2Job(CallBackDifferentInfoInterface manager2, String manager2Task) {        System.out.println("Worker" + manager2Task);        manager2.sendBackNumber(4f);    }}


很不幸的是,电话是一个工具,存入了所有的电话号码。还得员工自己决定回馈给哪个领导。不同结果给了错误领导是会发生不良事件的~~


领导一还是出来安排工作:


public class Manager1 extends CallBackDifferentInfoInterface {    public Manager1(Worker worker) {        worker.doManager1Job(this, "经理一要咖啡!");    }    @Override    public void sendBackInfo(boolean result) {        if (result) {            System.out.println("咖啡很好喝,谢谢~_~");        } else {            System.out.println("你先忙,稍后帮我弄好就行,谢谢~_~");        }    }}

结果是针对型回馈的,领导也就能依据结果再做决断,或者评判。
领导二也是不甘人后,需要员工帮点忙的:


public class Manager2 extends CallBackDifferentInfoInterface {    public Manager2(Worker worker) {        worker.doManager2Job(this, "经理二要你给一位员工评分!");    }    @Override    public void sendBackNumber(float result) {        if (result > 5) {            System.out.println("你对他印象还不错哦~_~");        } else {            System.out.println("你和他多多沟通交流~_~");        }    }}

我们的反馈一不小心表达了我们之间的关系,有时候也是需要长点心的吧~~
领导三是个比较随和的人,他安排任务,也给予一个全新视角:


public class Manager3 {    public Manager3(Worker worker) {        worker.doManager1Job(new CallBackDifferentInfoInterface() {            @Override            public void sendBackInfo(boolean result) {                if (result) {                    System.out.println("全家团圆饭,谢谢你~_~");                } else {                    System.out.println("麻烦你辛苦下,再找找,谢谢~_~");                }            }        }, "经理三要你定一桌饭!");        worker.doManager2Job(new CallBackDifferentInfoInterface() {            @Override            public void sendBackNumber(float result) {                if (result > 10) {                    System.out.println("看来最近市场缺肉有点严重~_~");                } else {                    System.out.println("价格行情还不错~_~");                }            }        }, "经理三要你确定鸡肉价格!");    }}

好吧,该干点事情了~_~


public class MyClass {    public static void main(String[] args) {        Worker worker = new Worker();        Manager1 manager1 = new Manager1(worker);        Manager2 manager2 = new Manager2(worker);        new Manager3(worker);    }}

好吧,给领导办完事情,回调机制,我们能否理解多一点。
我们也可以把自己的事情拆分下,交给自己的下属帮忙打理下~~怎么拆分任务,又怎么合理应用回调机制呢?哎呀喂,思考思考,我这笨脑子又需要琢磨琢磨了~~


四、Android Studio下java编程



1,基本环境
新建项目,有了基本的承载;新建java lib 项目,搭建java的编辑运行环境。


2,使用

public class MyClass {    public static void main(String[] args) {        Worker worker = new Worker();        Manager1 manager1 = new Manager1(worker);        Manager2 manager2 = new Manager2(worker);        new Manager3(worker);    }}

java程序主入口已经有了,类间的调用也有了。丰富更多类,java世界的大门再向我们敞开~~


3,注意事项


java运行环境中,控制台打印内容确是乱码,明明都是utf-8,WTF...
在java Module下修改build.gradle:


//新版tasks.withType(JavaCompile) {    options.encoding = "UTF-8"}//旧版/*tasks.withType(Compile) {    options.encoding = "UTF-8"}*/



哈哈,别问我为什么,你告诉我好不好?我也不知道,这个结果是度量告诉我的,能用,我没来得及往下挖掘呢~~









你以为我贫穷低微,并不高大美丽,就没有灵魂,没有真爱吗?

                                                                                                     --------------《简•爱》
 弯道超车


0 0