抽象类和接口我们都使用过,但是两者具体有什么区别呢?分别起什么作用呢?以下是个人的理解,供大家参考。
1. 抽象类体现代码复用以及能力差异化
abstract class BaseActivity extends AppCompatActivity {
protected Resources mResources;
private static class MyHandler extends Handler {
private WeakReference<BaseActivity> mReference;
public MyHandler(BaseActivity activity) {
mReference = new WeakReference<BaseActivity>(activity);
}
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (mReference.get() != null) {
mReference.get().handleMessage();
}
}
}
protected Handler mHandler = new MyHandler(this);
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {//1
super.onCreate(savedInstanceState);
mResources = getResources();
//dosomething 公共处理
}
@Override
protected void onDestroy() {//2
super.onDestroy();
//dosomething 公共处理
}
abstract void handleMessage();//3
}
- 注释1、2:重写onCreate以及onDestory函数,做一些常规的、公共的处理,这里体现的就是代码复用;
- 注释3:BaseActivity类定义公共的Handler,但每个子类对消息的处理可能都不一样,所以暴露一个抽象函数,让子类做定制化处理,这里体现能力差异化;
2. 接口体现代码隔离
class AManager {
private Listener mListener;
public void executeTask(Listener listener) {
this.mListener = listener;
mListener.onStart();//回调开始
//dosomething .....
if (mListener != null) {
mListener.onCompleted();//回调完成
}
}
public void cancelTask() {
if (mListener != null) {
mListener.onCancel();//回调取消
}
}
interface Listener {//2
void onStart();
void onCompleted();
void onCancel();
}
}
class HomeActivity extends AppCompatActivity implements AManager.Listener {
private AManager mAManager = new AManager();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAManager.executeTask(this);//1
}
@Override
public void onStart() {}
@Override
public void onCompleted() {}
@Override
public void onCancel() {}
}
- 注释1:触发mAManager.executeTask执行任务,因为HomeActivity实现了AManager.Listener,所以可以传入this作为参数;
- 注释2:定义Listener接口,作为HomeActivity与AManager之间交互的协议,AManager是如何执行任务、取消任务,并不是HomeActivity要关心,它只关心开始、完成、取消三种状态。Listener接口很好地将两者分开,起到隔离作用,只要接口协议不发生变化,彼此的交互不需要发生任何修改。