接口的定义
接口,百度百科:接口泛指实体把自己提供给外界的一种抽象化物(可以为另一实体),用以由内部操作分离出外部沟通方法,使其能被内部修改而不影响外界其他实体与其交互的方式。
—接口是干这个的,但是平常我们使用接口都是回调,比如我完成了一个东西,我回调一下,like this
代码的话,就是这个样子
public void start(Listener listener){
//xxxxxxxxxxxxxxxxxxxxxx
//listener.done(); // A
listener.error(); //B
}
//某个实现了接口的类
public class OP implements Listener{
public void done(){//具体操作}
public void error(){//....}
}
ok,平常的话就这么干的,拿来做回调了(接口本来就回调啊)
上面的定义,表名接口是一个内外交流的方式,打个比方:
一个充电宝,一根数据线,一部android(ios)。
充电宝一般有两个输出口,一个1A,一个2A。
那这两个端口就是给外部使用的,内部干嘛。内部就负责一系列的操作,最后给出1A/2A的电流就ok。数据线就是连接手机和充电宝的桥梁(Bridge),然后手机得到电流输入就自己负责更新电池Icon_UI以及硬件电池的蓄电。
写点代码整理一下,用内外部交流方法重新理解JAVA接口的使用,就可以这样创建CLASS了。
先定义好两个接口,就好比开放出来的口子让你用的
PowerOutElectric.java
public interface PowerOutElectric {
void out1A();//输出1A的电流
void out2A();//2A的电流
}
MobileGetElectric.java
public interface MobileGetElectric {
void start2Full(double p);//开始前进,向着满格进发
}
两种电器都定义好了接口——让外部使用。
接下来就是两个电器各自之间的方法(比如如何将化学能转化为电能,电能转化为化学能)
PowerBank.java
package kr;
import java.util.Timer;
import java.util.TimerTask;
public class PowerBank{
//1kw*h = 3.6*10^6J -> 1000w*1s = 1000J
//现存化学能 一直输出 4小时
private static double chemistry = 15000;
//转化技术等级 e.g: 1 -> 80% 升一级提升2%
// 上限99(不可能不损耗,这辈子都不可能,没有真香定律!)
private int techLevel = 5;
//电能计算公式
//W = U * I * T 电压默认5V -->> 5V*1A*1S = 5J
private int v = 5;
private int a1 = 1;
private int a2 = 2;
private double out;
private PowerOutElectric e;
public PowerBank(PowerOutElectric electric){
this.e = electric;
}
public void startWork(int port){
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
//p = U * T 功率 以及 损耗
if(port == 1){
out = v * 10 * ((techLevel-1) * 0.02 + 0.8) * a1;
}else {
out = v * 10 * ((techLevel-1) * 0.02 + 0.8) * a2;
}
chemistry -= out;
if(chemistry <= 0){
timer.cancel();
System.out.println("充电宝没电了");
out += chemistry;
chemistry = 0;
}
e.out1A(out);
showPower();
}
},0,10);//单位s
}
private void showPower(){
System.out.println("剩余电量"+getPower());
}
private double getPower(){
return chemistry;
}
}
上述是充电宝自主的操作一系列结束后将电能输出出去,usb就会通过充电宝暴露出的接口(1A,2A)得到能量。并且将能量传输给手机。
Mobile.java
public class Mobile implements MobileGetElectric {
private static double power = 0.1;
private void chong(double p) {
//每100J成为10%的电量
power += p / 100 * 0.1;
System.out.println(String.format("当前电量:%.1f%%", power * 100));
}
private boolean panduan() {
if (power >= 1) {
System.out.println("充满了");
return false;
//通知电量满了,usb可以断开了
//TODO:断开操作.
}
return true;
}
@Override
public void start2Full(double p) {
if (panduan())
chong(p);
}
}
但是两个电器要交流怎么办?就需要USB这根线,通过这个线让两个电器实现交(zhe)流(xue)♂。
USB.java
public class USB implements PowerOutElectric{
private PowerBank powerBank;
private Mobile mobile;
//private ChaTou chaTou; //插头
private int port;
private static final String material = "Cu";
public USB(int port){
//决定用哪个端口
this.port = port;
this.powerBank = new PowerBank(this);
}
public void connect(Mobile mobile){
this.mobile = mobile;
startWork();
}
private void startWork(){
//或者插头+手机
if(powerBank!=null&&mobile!=null){
powerBank.startWork(port);
}
}
private void transfer(double p){
double f;//最终结果
double b;//损耗
switch (material){
case "Cu":
b = 0.05;
break;
case "Light":
b = 0.01;
break;
default: b = 0.15;
}
f = p * b;
mobile.start2Full(f);
}
@Override
public void out1A(double out) {
transfer(out);
System.out.println("收到电量" + out);
}
@Override
public void out2A(double out) {
transfer(out);
System.out.println("收到电量" + out);
}
}
ok,USB实现了充电宝的接口,因为这是充电宝暴露出来的,usb调用了手机的接口,这是手机自己需要的,拿给其他人就拿不到值
就好比这样去梳理
将数据输出的,可以将一些操作暴露出去,因为TA需要告诉使用这些接口的东西,你们要的东西来了(usb需要充电宝的能量)
接受数据的,需要将拿到数据的操作暴露出来(手机将充电接口暴露出来了,意思就是:诺,我的口子在这,电能从这里给我。为什么要这样干,手机的接口这么多,没告诉哪个接口干什么的,充电插耳机?emmmmm以前的手机就这么干的),然后通过内部的操作将得到的数据(电能转换为自己的能量储蓄)
然后就需要一个Person了,拿着这三个东西进行最后的调(jie)试(he)。
其实“回调”只是将平常的“接口”改了个名字,同时也是为了完成我们的某些架构设计
源码链接:https://download.youkuaiyun.com/download/qq_34206863/10859227
欢迎访问我的网页Kkrisez,不定时将认为有用的搬过去