面向切面對象AOP

前言

  面向切面編程(思想)AOP Aspect Oriented  Programming,是面向對象基礎上 更關注最終目標 而不關注中間的小目標,簡而言之,就是我們的目標(例如constroller)觸發了我們關注的方法,此時就執行我們的觀察者行為,例如在目標的方法觸發前做事,觸發後做事等等。

  為了讓大家更好的理解,這裡把面向過程、面向對象先講解一遍。

 

面向過程編程(思想)POP

  Procedure  Oriented  Programming,面向過程編程思想(關注事情步驟,事情本身),將一件事情的整體看作是一個流程,我們更關注事情的流程、步驟。比如我去超市買菜,我要下樓,等紅綠燈,走過幾條街道,進入超市選擇自己要的菜,然後排隊買單。我會關注這些過程要經歷的事件,步驟。

 

面向對象編程(思想)OOP

  Object  Oriented  Programming,面向對象編程思想(關注中間有幾個對象參與其中),將原有整體事情的步驟,拆分成小段,每一個小段封裝成一個單獨的事情(方法),不同的方法交給不同的人來做,例如我去超市買菜,我在家裡出發,最終目的是在超市買菜,中間幾個環節交給不同的人(對象)來幫我做:下樓(被人背下去),打車,選菜,排隊等等都有人幫我做,我只要把這些順序連起來,指揮不同的對象按照我要求的順序執行便可。

 

面向切面編程(思想)AOP

  Aspect Oriented  Programming,面向切面編程思想(面向對象基礎上 更關注最終目標 而不關注中間的小目標),但要注意切面本身也是對象,比如我去超市買菜,我為起始對象,超市為目標對象,在我到超市之前所經歷的事情都歸納到切面對象(下樓,打車,選菜,排隊執行這些方法的人(對象)等等),連接點(管理切面對象中的方法按順序執行),代理對象負責管理這些切面對象,切點為買菜(即在目標對象中觸發我們關心的方法);

 

案例

  這裡就用js模擬了,js模擬簡單些,java模擬的話思路也是一樣的,而且java的spring本身用xml或註解就可以了,這裡主要講思想

// 面向切面的方式
class agency{//可以理解為過濾器

  before(){
    console.log("走路去超市");
  }
  
  main(Func){//代理對象
    this.before();
    Func();
    this.after();
  }
  
  after(){
    console.log("走路回家");
  }

}

let agencyObj = new agency();//找代理,類似找人幫我們買菜送上門,這方式好處在於其他人還可以找代理買傢具,買學慣用品等等,我們生成了一次代理,然後傳不同的任務進去讓代理幫我們執行
function  main(){
  money -= 55;
  console.log("買完菜,減去55元,還剩:"+money);
}
agencyObj.main(main);//結果同上

money = 100;
function  main2(){
  money -= 98;
  console.log("買日用品,減去98元,還剩:"+money);
}
agencyObj.main(main2);

  上面的before和after方法可以當成過濾器,比如我要得到的數據渲染前先解密,解密渲染後,部分數據用*替換這類場景。

 

思路

  面向切面的方式就是更注重結果而不注重中間實現的步驟,中間無論由多少個切面對象幫你做了事,都由一個代理對象來幫你管理執行,而我們需要做的就是把要做的事告訴代理對象。當然面向切面的方式是否使用要根據業務場景來定,如果發現有多個方法中間需要執行的步驟流程一致,而這些方法只需要拿到經過這些步驟之後所得到的結果,不關心中間發生了什麼,就使用面向切面的方式。