android AOP在項(xiàng)目中的運(yùn)用

前言

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é)果:


End

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,428評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,024評(píng)論 3 413
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,285評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,548評(píng)論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,328評(píng)論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,878評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,971評(píng)論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,098評(píng)論 0 286
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,616評(píng)論 1 331
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,554評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,725評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,243評(píng)論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,971評(píng)論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,361評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,613評(píng)論 1 280
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,339評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,695評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容

  • Android中AOP的實(shí)際運(yùn)用 一、AOP簡(jiǎn)介 AOP即面向切面編程,區(qū)別于OOP(面向?qū)ο缶幊蹋┑墓δ苣K化,...
    TokyoZ閱讀 642評(píng)論 0 0
  • 用兩張圖告訴你,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 12,765評(píng)論 2 59
  • title: Android AOP之字節(jié)碼插樁author: 陶超description: 實(shí)現(xiàn)數(shù)據(jù)收集SDK時(shí)...
    陶菜菜閱讀 38,221評(píng)論 40 182
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者,不喜歡去冒險(xiǎn),但是人生放棄了冒險(xiǎn),也就放棄了無數(shù)的可能。 ...
    yichen大刀閱讀 6,073評(píng)論 0 4
  • 公元:2019年11月28日19時(shí)42分農(nóng)歷:二零一九年 十一月 初三日 戌時(shí)干支:己亥乙亥己巳甲戌當(dāng)月節(jié)氣:立冬...
    石放閱讀 6,901評(píng)論 0 2