Java - 抽象类 pk 接口

159 阅读1分钟

抽象类和接口我们都使用过,但是两者具体有什么区别呢?分别起什么作用呢?以下是个人的理解,供大家参考。

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接口很好地将两者分开,起到隔离作用,只要接口协议不发生变化,彼此的交互不需要发生任何修改。