package Review; //coding coding coding everyday!!! /* 闭包和回调: 闭包指的是一个可以被调用的对象:这个对象携带了一些信息。这些信息来自于定义这个闭包时的作用域 回调是一个机制:指的是可以返回一些信息过来 回调类似于c语言中的指针:一个信息进去以后又可以携带一些信息回来,但是java中完全屏蔽了指针,所以使用内部类来代替指针 */ //以下是一个闭包和回调的例子: //图吧的牛爷爷需要帮哥们装机:装机的过程由哥们进行,而牛爷爷只需要硬件的挑选就行了。 //过程中哥们需要提供具体的金额让牛爷爷来装机 interface doJob{ void dowork(int money,String s); }//需要硬件来干嘛就是个性化的事情了,所以这里使用一个接口作为统一的模版来给顾客进行使用 //这是一个汇总的东西:参数是顾客的需求和服务返回的结果,反正都是得到的信息 //然后方法根据信息就可以展现你需要这些东西来干嘛的。 class Bro{//这是顾客类 class Game implements doJob{ //顾客类需要一个内部类来实现这个统一的接口 @Override public void dowork(int money , String s){ System.out.println("使用预算: " + money +" 购入配置: " + s + " 来打游戏"); }//这个内部类的实质就是客户的需求 } void CallNB(int money){ new NB("哥们的牛爷爷").Set(money,new Game()); }//然后还有一个方法是来调用服务端的功能的,这个方法又叫做回调函数,它确实会携带一些信息出来 //这个方法的参数就是顾客需要告诉给服务端的原信息,然后服务端根据这个信息来进行一些操作和计算 } class NB{//这是服务端的类:负责处理用于给过来的信息然后得到一些东西,但是得到的结果到底应该怎么使用是客户的事情 //所以最后还需要调用客户端的方法来使用这些结果,所以不得不将客户端作为参数传入。 String name; NB(String name){ this.name = name; } void Set(int money,doJob s)//传入客户端参数:使用一个人向上转型就行了:实际上传入的是客户端的内部类的派生类型 //因为我们不需要客户的所有信息,只需要他的需求就行了 { //牛爷爷的功能:负责根据预算筛选可能的硬件,然后将这些信息返回给哥们 //所以他还需要调用哥们的功能,也就是说哥们需要暴露一些信息给牛爷爷:这里使用接口和内部类完成 //所以牛爷爷的方法中还要将一个向上转型的哥们的类型作为参数一起传入才行 String Hardware = null; int set = 0; if(money == 0){ set = -1; }else if( money >= 0 && money <= 1000){ set = 1; }else if(money > 1000 && money <= 4000){ set = 2; }else if(money > 4000 && money <= 7000){ set = 3; }else if(money > 7000 && money <= 10000){ set = 4; } switch(set){ case -1: Hardware = "fuck you !!!!";break; case 1: Hardware = "E599003 + RX580";break; case 2: Hardware = "i5 + RTX 2060";break; case 3: Hardware = "i7 + RTX 3080";break; case 4: Hardware = "i9 + RTX 4090";break; default:Hardware = "What fuck with you????";break; } s.dowork(money,Hardware);//这里就是将得到的结果又返回给客户端 } }//通过接口还可以实现代码的复用: //比如说牛爷爷多一个顾客需要实现不同的功能,那么添加一个新类时直接在重写的时候写成其他类型就行了 class Boss { String name; class Dowork implements doJob { @Override public void dowork(int money , String s){ System.out.println("使用预算:" + money + " 购入配置:" + s + " 来开网吧"); } } void CallNB(int money){ new NB("网吧老板的牛爷爷").Set(money,new Dowork()); } } public class 复习16 { //现在可以测试一下这个闭包和回调如何了: public static void main(String[] args) { int money = 7500; Bro bro = new Bro();//海海!!直接从类中捏一个bro出来 bro.CallNB(money);//然后就可以直接呼叫牛爷爷了 Boss boss = new Boss(); boss.CallNB(2200 ); } }