Java方法回调机制(Callback)

方式1

Request.java
@Data
public class Request implements Serializable {
    private String url;
    private String payCode;
    private String amount;
}
IPay.java
public interface IPay {
    void pay(Request request);
}
Context.java
public class Context {

    public void execute(IPay iPay, Request request){
        System.out.println("开始支付");
        System.out.println("payCode:"+request.getPayCode());
        request.setUrl(request.getUrl()+"/pay");  //修改A类中的属性值
        iPay.pay(request);   //调用A类中的实现
        System.out.println("支付结束");
    }
}
Test.java
/***
 * A->B, B->A
 */
public class Test {
    public static void main(String[] args) {

        final Request request = new Request();
        request.setUrl("http://open.ucc.com");
        request.setPayCode("855652566365233");
        request.setAmount("500");

        Context context = new Context();
        context.execute((req)->{    //调用B类的execute, 并传入request
            System.out.println("request.url:" + req.getUrl());
            System.out.println("支付业务处理");
        }, request);
    }
}

方式2

GasListener.java
public interface GasListener {
    public void offerGas(String msg);
}
GasCompany.java
public class GasCompany implements GasListener {

    public void advertiseTo(IndoorsMan man)
    {
        System.out.println("1.煤气公司:这是我们的联系方式,欢迎来电!");
        man.setListener(this);
    }

    @Override
    public void offerGas(String msg) {
        System.out.println("5.煤气公司接收的订单:"+msg);
    }
}
IndoorsMan.java
//调用者:
public class IndoorsMan {

    GasListener gListener;

    public void prepareCook()
    {
        System.out.println("2.宅男:准备下厨做几个花式大菜!");
        System.out.println("3.宅男:进厨房,烧菜...");
        System.out.println("4.宅男:刚开火,就发现煤气不足,没办法,只能打电话叫煤气。");
        gListener.offerGas("宅男:送一瓶煤气过来!");
    }

    public void setListener(GasListener gListener)
    {
        this.gListener = gListener;
    }
}
Test.java
public class Test {
    public static void main(String[] args)
    {
        IndoorsMan man = new IndoorsMan();
        GasCompany company = new GasCompany();
        company.advertiseTo(man);
        man.prepareCook();
    }
}