前言
AOP是Aspect Oriented Programming的縮寫,即『面向切面編程』。它和我們平時(shí)接觸到的OOP都是編程的不同思想,OOP,即『面向?qū)ο缶幊獭唬岢氖菍⒐δ苣K化,對(duì)象化,而AOP的思想,則不太一樣,它提倡的是針對(duì)同一類問題的統(tǒng)一處理,通過預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。AOP是OOP的延續(xù),是軟件開發(fā)中的一個(gè)熱點(diǎn),也是Spring框架中的一個(gè)重要內(nèi)容,是函數(shù)式編程的一種衍生范型。利用AOP可以對(duì)業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時(shí)提高了開發(fā)的效率。
一:實(shí)際場(chǎng)景分析
我們先看一個(gè)場(chǎng)景,我們?cè)谶M(jìn)行取款、查詢、轉(zhuǎn)賬操作的時(shí)候,都要驗(yàn)證用戶的身份,然后(取款、查詢、轉(zhuǎn)賬)都是一個(gè)完整的子流程,這些子流程中都有相同的流程,就是驗(yàn)證用戶,我們把這個(gè)驗(yàn)證用戶流程抽出來,這就是AOP的大概思想
二:APP場(chǎng)景分析
在一個(gè)android app項(xiàng)目中,假如現(xiàn)在有個(gè)需求:當(dāng)前App處于前臺(tái)還是后臺(tái),我們有什么辦法呢?很多人說寫一個(gè)Activity基類BaseActivity,然后所有的Activity繼承它,在子類重寫其生命周期方法,然后在每個(gè)Activity的生命周期里面進(jìn)行判斷,這個(gè)方法也可以,但是如果一個(gè)項(xiàng)目有幾百個(gè)Activity,難道我們要每個(gè)界面都寫一遍相同的代碼嗎?
因此,谷歌的工程師提供了在Application中提供了一個(gè)方法方便開發(fā)者們監(jiān)聽Activity的生命周期,對(duì)該Application下面的Activity生命周期進(jìn)行監(jiān)聽。
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
});
參考實(shí)際場(chǎng)景分析,假如現(xiàn)在有三個(gè)Activity,分別是Activity1、Activity2、Activity3
Activity1是取款界面
Activity2是查詢界面
Activity3是轉(zhuǎn)賬界面
假如現(xiàn)在有個(gè)需求: 在這三個(gè)界面時(shí),如果用戶退到后臺(tái)我們需要寫文件記錄,那我們是不是registerActivityLifecycleCallbacks通過在onActivityStopped中統(tǒng)一判斷就可以了
三:AOP Demo
還是第一個(gè)步驟中的實(shí)際場(chǎng)景分析,假如我們?cè)谌】睢⒉樵儭⑥D(zhuǎn)賬流程之前都要先做驗(yàn)證用戶身份,我們看下如果用代碼怎么實(shí)現(xiàn)
public interface IMoneyOperation {
/**
* 取款流程
*/
void withdrawal();
/**
* 查詢流程
*/
void query();
/**
* 轉(zhuǎn)賬流程
*/
void transfer();
}
在寫一個(gè)Activity實(shí)現(xiàn)這個(gè)接口,用動(dòng)態(tài)代理在類加載的時(shí)候去前后做一些操作
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import androidx.annotation.Nullable;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class AopTestActivity extends Activity implements IMoneyOperation {
private static final String TAG = "AopTest >>";
private IMoneyOperation iMoneyOperation;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_aop_activity);
iMoneyOperation = (IMoneyOperation) Proxy.newProxyInstance(IMoneyOperation.class.getClassLoader(), new Class[]{IMoneyOperation.class}, new IMoneyHandler(this));
}
public void onClick(View view) {
iMoneyOperation.withdrawal();
iMoneyOperation.query();
iMoneyOperation.transfer();
}
class IMoneyHandler implements InvocationHandler {
IMoneyOperation iMoneyOperation;
public IMoneyHandler(IMoneyOperation operation) {
iMoneyOperation = operation;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//先驗(yàn)證用戶身份
verifyUserId();
Object invoke = method.invoke(iMoneyOperation, args);
return invoke;
}
}
/**
* 驗(yàn)證用戶身份流程
*/
private void verifyUserId() {
Log.i(TAG, "先驗(yàn)證用戶身份,驗(yàn)證通過,開始操作");
}
@Override
public void withdrawal() {
Log.i(TAG, "取款流程");
Log.i(TAG, "===========================");
}
@Override
public void query() {
Log.i(TAG, "查詢流程");
Log.i(TAG, "===========================");
}
@Override
public void transfer() {
Log.i(TAG, "轉(zhuǎn)賬流程");
Log.i(TAG, "===========================");
}
}
我們看下最后的結(jié)果: