接口大概意思:
- 工人class B:想干一件事(如打电话),但没工具(如手机)。注:最终还是他自己干。
- 租赁人class A:是租赁工具的,有很多工具,其中包括B要接的工具(手机)。
- 工具箱interface :手机、电脑、扳手、烙铁。。。
实例实现过程是:
A把带工具(interface)和方法都借给了B,B完成了想干的事(打电话)。
另:A向B出借东西时,可以有附件约定/规定。
为啥这么做:
- 解耦,出租人A、承租人B、工具接口全部解耦。
- 其他人C、D、E…不必各自占有工具,想干活都想A借,方便管理,节约资源。
- B、C、D、E…等人借来工具后,怎么干活,什么时候干活,还想干些啥自己说了算。
例子:
interface 手机(){
打电话();
充电();
玩游戏();
doanything()。。。。。//手机可以干的其他事
}
class A{
手机 _手机;
//相当于构造函数初始化赋值。
void set手机(手机 _手机){
this._手机 =_手机;
}
借手机(){
手机.打电话();
休息2分钟在用手机();//出租人A可以规定让承租人B某些事,或者怎么敢。。。可以在这里约定。如用开启线程,一边玩游戏,一边打电话。
手机.玩游戏();
dosomething();
}
借电脑(电脑){};
....
}
class B{
A a = new A()//
a.set手机(华为手机)//可以用匿名函数初始化。
a.借手机()
手机 华为手机 = new 手机(){
@Override
打电话(){
打给女朋友,秀恩爱。
}
@Override
玩游戏(){
玩下望着荣耀。
}
@Override
充电(){}; //B不充电,可以不干,即不用实现。
@Override
doanything(){}; //B不干其他事了,也即不用实现。
}
}
实例
(对于Android界面上Button点击事件监听的模拟):
1.定义接口
public interface OnClickListener {
public void OnClick(Button b);
}
2. 定义Button
public class Button {
OnClickListener listener;
public void click() {
listener.OnClick(this);
}
public void setOnClickListener(OnClickListener listener) {
this.listener = listener;
}
}
3. 将接口对象OnClickListener 赋给 Button的接口成员
public class Activity {
public Activity() {
}
public static void main(String[] args) {
Button button = new Button();
button.setOnClickListener(new OnClickListener(){
@Override
public void OnClick(Button b) {
System.out.println(clicked);
}
});
button.click();
}
}
实例2:
增加一个demo 有助于进一步理解。
主线程开启一个异步任务,当异步任务接收到数据,则把数据用TextView显示出来
1、定义接口:
首先 我们需要定义一个接口,定义一个方法,参数为一个字符串:
public interface ChangeTitle {
void onChangeTitle(String title);
}
2、定义MyTask :
写一个异步任务,把接口作为构造方法参数,在doInBackground()方法中判断如果有数据,则接口回调
import android.os.AsyncTask;
public class MyTask extends AsyncTask<String,Void,String> {
private ChangeTitle changeTitle;
public MyTask(ChangeTitle changeTitle){
this.changeTitle = changeTitle;
}
@Override
protected String doInBackground(String... params) {
if (params[0]!=null) {
changeTitle.onChangeTitle(params[0]);
}
return null;
}
}
3、实现 接口回调:
主Activity,给异步任务参数传this,即 接口回调方法在此类中执行,那么就需要实现ChangeTitle接口,重写接口中onChangeTitle 方法
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import test.ban.com.callback.R;
public class MyTaskActivity extends Activity implements ChangeTitle {
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.tv);
new MyTask(this).execute("我是标题");
}
@Override
public void onChangeTitle(String title) {
mTextView.setText(title);
}
}