java interface 理解

接口的定义

接口,百度百科:接口泛指实体把自己提供给外界的一种抽象化物(可以为另一实体),用以由内部操作分离出外部沟通方法,使其能被内部修改而不影响外界其他实体与其交互的方式。

—接口是干这个的,但是平常我们使用接口都是回调,比如我完成了一个东西,我回调一下,like this

Created with Raphaël 2.2.0 EVENT_DONE 回调接口 choose A()? A() OTHER OP B() yes no

代码的话,就是这个样子

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.csdn.net/download/qq_34206863/10859227

欢迎访问我的网页Kkrisez,不定时将认为有用的搬过去

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值