1. 程式人生 > >java設計模式之代理模式 ,以及和java 回調機制的區別

java設計模式之代理模式 ,以及和java 回調機制的區別

-s pac 回調模式 unit 為什麽 創建 col 重要 溫習

  1. java 代理模式就是

      將自己要做的事交給別人去做(這個別人就是代理者,自己就是被代理者),為什麽自己能做的要交給別人去做了?假如一個小學生小明,現在要寫作業,但是又想玩遊戲,他更想玩遊戲,並且不想被媽媽罵,所有他找了個天才槍手,小紅給他代寫作業,自己再去把作業交給媽媽檢查。小明媽媽看見是小明交的作業,也就沒懷疑不是他自己的做的。目的達到了,過程就不那麽重要了(當然不是不對的了,這裏只是為了講述設計模式而模擬的某種場景)。  

  

  2.代理模式要點:

     1.一個抽象的主題(這裏抽象的主題就是寫作業)

     2.一個代理者(小紅),繼承抽象主題(寫作業)

     3.一個被代理者(小明),繼承抽象主題(寫作業)

     4.一個管理者繼承抽象主題,一個被代理者對象(3 和 4 可以任選一個,3 是將被代理者和管理者合並成一個 ,4 是將被代理者 和 管理者分開)

      

   3.代理模式的應用:spring AOP 面相切面編程,例如事物的管理委托給spring 容器去管理,程序員只用關系核心業務層,高度復用的模塊交給代理者去做,不用重復的工作。增加系統的代碼冗余。

代碼:

抽象主題

package javadesign.staticProxy;

/**
 * Created by Administrator on 2017/12/21.
 *
 * 概念:某項任務要交給對象A完成,C又把A 的任務交給了B去做,A就是被代理者,B就是代理者,C 就是委托人
 *
 * 實現:創建一個代理的主題,代理者和被代理者都繼承這個類並且,實現主題
 * 為什麽代理類和被代理類都要實現這個?現在有個做作業的任務,抽象出來一個做作業的主題。
 *
 * 場景 :一天小明的媽媽讓小明做作業,首先小明得接受做作業這個任務,所以他繼承做作業這個主題,
 * 但是小明想打遊戲,作業還必須得完成,他找到一個瞞天過海的方法,讓小紅去做作業,但是還要偽裝成自己的做的,
 * 所以小紅也得繼承做作業這個主題
 *
 * 效果:小紅 和 小明 都是調用同一個做作業名稱,小明媽媽傻傻分不清楚,到底是誰做的作業(真正是小紅做的,只是小明媽媽不知道),
 * 這就達到了代理的目的
 *
 
*/ public interface ProxyWork { public void doHomeWork(); }

被代理者(or 委托者)

package javadesign.staticProxy;

import org.junit.Test;

/**
 * Created by Administrator on 2017/12/21.
 * 創建一個代理的管理者,將要代理的任務分配給真正的處理任務的類,就是小明把自己的作業交給小紅學霸做啦
 */
public class ProxyManager implements ProxyWork {
    private ProxyWork proxyWork;

    
/* * 這個方法是設置代理的方法,運用到了java 多態的思想 * */ public void setAgency(ProxyWork proxyWork){ this.proxyWork=proxyWork; // 這個方法是將真正的代理類(小紅)作為參數傳遞給 } @Override public void doHomeWork() { System.out.println("小明開始假裝做作業"); //其實小明沒有做作業,而是叫來小紅,讓小紅去做 if(this.proxyWork!=null){ //先判斷小紅的引用是否傳遞過來 proxyWork.doHomeWork(); //這裏小紅開始做作業,實施瞞天過海大計的關鍵一步 } System.out.println("小明告訴媽媽,作業完成了"); } /* * 開始測試代理,模擬一個場景 * * */ @Test public void client(){ ProxyManager proxyManager=new ProxyManager(); proxyManager.setAgency(new ProxyRealWork()); //new ProxyRealWork 創建一個名叫小紅的代理者 proxyManager.doHomeWork(); //小明開始假裝做作業,真正做作業的是小紅 } }

代理者:

package javadesign.staticProxy;

/**
 * Created by Administrator on 2017/12/21.
 */
public class ProxyRealWork implements ProxyWork {

    private ProxyWork proxyWork;   //將被代理者,也就是遊戲小王子小明傳遞過來,其實也就是java 的多態

    //這裏傳入被代理者,用到了多態
    public void setAgency(ProxyWork proxyWork){   //這裏將會傳入實例化的小明
        this.proxyWork=proxyWork;
    }


    /*
        這個代理者是真正做作業的人,也即是小紅這個學霸
     */
    @Override
    public void doHomeWork() {
        this.before();
        //這個位置也就是相當於Spring Aop 切點的位置service 層
         System.out.println("                     真正的任務執行者,正在執行任務,也就是小紅做作業啦");
        this.after();
    }

    /*
    * 這裏的預處理和善後處理類似於Spring的面向切面編程,具體的實現有事務管理,日誌等
    * */

    //預處理動作
    private void before(){
        //TODO
        System.out.println("                 小紅預溫習了功課,然後開始做作業");
    }

    //善後處理
    private void after(){
        //TODO
        System.out.println("                   小紅把做完的作業又檢查了一遍,不能做的全對,不然太假了");
    }
}

代理模式和回調模式的區別:

  本人認為兩者是相同的,都是同一種思想(自己的事情交給別人做,自己發出命令),若要真的找不同,那就從他們具體的實現方式(代理模式:追求主題的統一,發出命令,各謀其事;回調機制:追求通知,發出命令,接受通知)

註釋:本文中的代理模式是靜態代理,耦合性很高,在項目中可能很少用,所以項目中要開發通用的代理就要利用反射機制,實現動態代理。(例如 小紅 要幫小明,小張,小王三個人寫作業,他們的作業本的要分別對應他們三個人,不能只對應某個人)

註明:本文原創,可以轉載,可以評論,有不對的地方歡迎指正,在別的地方看到類似的文章,不喜勿噴,只是自己加深理解寫的文章 。

  

java設計模式之代理模式 ,以及和java 回調機制的區別