• Java 之 回调方法


      打个比方,我们点外卖都有到达提醒的服务,顾客自己选择提醒的方式。可以是电话提醒、短信提醒、也可以敲门提醒,这里,“提醒”这个行为是美团或饿了么这样的平台提供的,相当于库函数,但是提醒的方式是由顾客决定并告诉平台的,也就是回调函数。而顾客告诉平台怎么提醒自己的动作,也就是把回调函数传入库函数的动作,称为登记回调函数(to register a callback function)

      很显然 回调 是一种设计模式,和代理一样都是通过 继承 接口来实现的(回调也可以通过抽象类)

    1、回调的接口

    package Interface;
    /**
     * 此接口为外卖提醒业务接口,提供了三种提醒方式
     */
    public interface TakeOutServiceInterface {
        /**
         * 提醒方式:电话
         */
        public void TelephoneReminderService(String PhoneNumber,String Content);
        /**
         * 提醒方式:短信
         */
        public void MessageReminderService(String PhoneNumber,String Content);
        /**
         * 提醒方式:敲门
         */
        public void KnockDoorReminderService(String Content);
    }

    2、客户端

    package Service;
    
    import Interface.TakeOutServiceInterface;
    public class Guest implements TakeOutServiceInterface {
        private String _phoneNumber;
        private String _content;
        private String _type;
    
        public Guest(String PhoneNumber,String Content,String type){
            this._phoneNumber=PhoneNumber;
            this._content=Content;
            this._type=type;
        }
        //下单
        public void PlaceOrder(){
            System.out.println("网上下单:"+_content+"提醒方式:"_type);
            new ShopOwner().doOrder(_phoneNumber, _content, _type,this);
        }
        //电话提醒方法
        @Override
        public void TelephoneReminderService(String PhoneNumber, String Content) {
            System.out.println(PhoneNumber+":"+Content);
        }
        //短信提醒方法
        @Override
        public void MessageReminderService(String PhoneNumber, String Content) {
    
        }
        //敲门提醒方法
        @Override
        public void KnockDoorReminderService(String Content) {
    
        }
    }

    3、平台服务端

    package Service;
    
    import Interface.TakeOutServiceInterface;
    
    public class ShopOwner {
    
        public void doOrder(String PhoneNumber,String Content,String Type,TakeOutServiceInterface hotelService){
    
            System.out.println("店家处理订单,等待中。。。");
            try {
                Thread.currentThread().sleep(3000);
    
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            System.out.println("外卖到达,提醒顾客。");
    
            if(!Type.equals("")){
                switch (Type){
                    case "电话":
                        hotelService.TelephoneReminderService(PhoneNumber,"喂,您好,您的外卖已送达请下来取一下。");
                        break;
                    case "短信":
                        hotelService.MessageReminderService(PhoneNumber,"您的外卖已送达请下来取一下。");
                        break;
                    case "敲门":
                        hotelService.KnockDoorReminderService("您好,您的外卖到了");
                        break;
                }
            }
        }
    }

    4、测试

    package Test;
    
    import Service.Guest;
    public class TestCallBack {
        public static void main(String[] args) {
            String PhoneNumber="Not_Copy";
            String Content="老板来一份黄焖鸡米饭。";
            String Type="电话";
            Guest guest = new Guest(PhoneNumber,Content,Type);
            guest.PlaceOrder();
        }
    }

    5、结果

    网上下单:老板来一份黄焖鸡米饭。提醒方式:电话
    店家处理订单,等待中。。。
    外卖到达,提醒顾客。
    Not_Copy:喂,您好,您的外卖已送达请下来取一下。

    6、总结

      在测试中 guest对象 只是调用了 下单PlaceOrder() 这一个方法,服务端就会根据接口类库的方法 回调到 guest对象的 电话提醒  TelephoneReminderService 的方法,前提是 这个方法在 回调接口  中注册了才行。

    注:这里的 回调接口也可以用 抽象类来代替。

    参考:https://www.cnblogs.com/liboBlog/p/7107440.html

  • 相关阅读:
    转载:SSH无法连接error:couldnotloadhostkey:/etc/ssh/ssh_host_dsa_key
    docker修改运行中的容器端口映射
    查看iis进程(w3wp)所对应的程序池名称 / 端口使用情况
    jenkins+sonar+钉钉 发布.net
    windows使用jenkins 搭建 .net 自动发布IIS站点平台
    Redis
    20191209---自定义异常类--转载
    借助pywinauto实现本地文件上传--转载
    python虚拟环境搭建,虚拟环境迁移,三方库安装
    python 在不同层级目录import 模块的方法
  • 原文地址:https://www.cnblogs.com/mww-NOTCOPY/p/11285877.html
Copyright © 2020-2023  润新知