程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java應用設計形式中的署理形式構建項目標實例展現

Java應用設計形式中的署理形式構建項目標實例展現

編輯:關於JAVA

Java應用設計形式中的署理形式構建項目標實例展現。本站提示廣大學習愛好者:(Java應用設計形式中的署理形式構建項目標實例展現)文章只能為提供參考,不一定能成為您想要的結果。以下是Java應用設計形式中的署理形式構建項目標實例展現正文


概念

署理形式(Proxy):署理形式其實就是多一個署理類出來,替原對象停止一些操作。好比咱有的時刻打訟事須要請律師,由於律師在司法方面有特長,可以替咱停止操作表達咱的設法主意,這就是署理的意思。署理形式分為兩類:1、靜態署理(不應用jdk外面的辦法);2、靜態署理(應用jdk外面的InvocationHandler和Proxy)。
靜態署理由法式員創立或對象生成署理類的源碼,再編譯署理類。所謂靜態也就是在法式運轉前就曾經存在署理類的字節碼文件,署理類和拜托類的關系在運轉前就肯定了。
靜態署理類的源碼是在法式運轉時代由JVM依據反射等機制靜態的生成,所以不存在署理類的字節碼文件。署理類和拜托類的關系是在法式運轉時肯定。

示例
這裡我們舉一個靜態署理的例子:
類圖:

/** 
 * 游戲者接口 
 * 
 */ 
public interface IGamePlayer { 
 
  // 登錄游戲 
  public void login(String user, String password); 
 
  // 殺怪,收集游戲的重要特點 
  public void killBoss(); 
 
  // 進級 
  public void upgrade(); 
 
} 

/** 
 * 游戲者 
 * 
 */ 
public class GamePlayer implements IGamePlayer { 
 
  private String name = ""; 
 
  // 經由過程結構函數傳遞稱號 
  public GamePlayer(String _name) { 
    this.name = _name; 
  } 
 
  // 打怪,最希冀的就是殺老怪 
 
  public void killBoss() { 
 
    System.out.println(this.name + " 在打怪!"); 
 
  } 
 
  // 進游戲之前你確定要登錄吧,這是一個需要前提 
  public void login(String user, String password) { 
    System.out.println("登錄名為" + user + " 的腳色 " + this.name + "登錄勝利!"); 
  } 
 
  // 進級,進級有許多辦法,花錢買是一種,做義務也是一種 
  public void upgrade() { 
    System.out.println(this.name + " 又升了一級!"); 
  } 
 
} 

/** 
 * 客戶端 對被署理對象弗成見 
 */ 
public class GamePlayerProxy implements IGamePlayer { 
 
  private IGamePlayer gamePlayer = null;//被署理對象 
 
  // 經由過程結構函數傳遞要對誰停止代練 
  public GamePlayerProxy(String username) { 
    this.gamePlayer = new GamePlayer(username); 
  } 
 
  // 代練殺怪 
  public void killBoss() { 
    this.gamePlayer.killBoss(); 
  } 
 
  // 代練登錄 
  public void login(String user, String password) { 
    this.gamePlayer.login(user, password); 
  } 
 
  // 代練進級 
  public void upgrade() { 
    this.gamePlayer.upgrade(); 
  } 
 
} 

/* 
 * 客戶端 對被署理對象弗成見 
 */ 
public class GamePlayerProxy2 implements IGamePlayer { 
 
  private IGamePlayer gamePlayer = null;//被署理對象 
 
  // 經由過程結構函數傳遞要對誰停止代練 
  public GamePlayerProxy2(String username) { 
    this.gamePlayer = new GamePlayer(username); 
  } 
 
  // 代練殺怪 
  public void killBoss() { 
    this.gamePlayer.killBoss(); 
  } 
 
  // 代練登錄 
  public void login(String user, String password) { 
    System.out.println("登錄時光是:" + new Date().toLocaleString()); 
    this.gamePlayer.login(user, password); 
  } 
 
  // 代練進級 
  public void upgrade() { 
    this.gamePlayer.upgrade(); 
    System.out.println("進級時光是:" + new Date().toLocaleString()); 
  } 
 
} 


/* 
 * 客戶端 對被署理對象弗成見 
 */ 
public class GamePlayerProxy3 { 
 
  private IGamePlayer gamePlayer; 
  // 經由過程結構函數傳遞 被代練(署理)對象 
  public GamePlayerProxy3(IGamePlayer gamePlayer) { 
     this.gamePlayer = gamePlayer; 
     System.out.println("我是一位代練,我玩的腳色是他人的,可以靜態傳遞出去"); 
  } 
   
  public IGamePlayer getProxy() { 
    return (IGamePlayer) Proxy.newProxyInstance(this.getClass().getClassLoader(),  
        new Class[]{IGamePlayer.class}, new MyInvocationHandler()); 
  } 
 
  private class MyInvocationHandler implements InvocationHandler { 
   
    @Override 
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
      if (method.getName().equals("login")) { 
        System.out.println("登錄時光是:" + new Date().toLocaleString()); 
      } if (method.getName().equals("upgrade")) { 
        System.out.println("進級時光是:" + new Date().toLocaleString()); 
      } 
      method.invoke(gamePlayer, args); 
      return null; 
    } 
     
  } 
} 


public class Test { 
  public static void main(String[] args) { 
    /* 
     * 通俗的靜態署理: 客戶端不曉得被署理對象,由署理對象完成其功效的挪用 
     */ 
    IGamePlayer proxy = new GamePlayerProxy("X"); 
    System.out.println("開端時光是:" + new Date().toLocaleString()); 
    proxy.login("zhangSan", "abcd"); 
    proxy.killBoss(); 
    proxy.upgrade(); 
    System.out.println("停止時光是:" + new Date().toLocaleString()); 
     
    System.out.println(); 
     
    /* 
     * 署理對象 加強了 被署理對象的功效 
     */ 
    IGamePlayer proxy2 = new GamePlayerProxy2("M"); 
    proxy2.login("lisi", "efg"); 
    proxy2.killBoss(); 
    proxy2.upgrade(); 
     
    System.out.println(); 
     
    /* 
     * 靜態署理:應用jdk供給的InvocationHandler,反射挪用被署理對象的辦法 
     * 聯合java.reflect.Proxy 發生署理對象 
     * 靜態傳入被署理對象結構InvocationHandler,在handler中的invoke時可以加強被署理對象的辦法的功效 
     * 或許說:(面向切面:)在甚麼處所(銜接點), 履行甚麼行動(告訴) 
     * GamePlayerProxy3中是辦法名為login時告訴開端時光,upgrade時告訴停止時光 
     */ 
    GamePlayerProxy3 dynamic = new GamePlayerProxy3(new GamePlayer("Y")); 
    IGamePlayer dynamicPlayer = dynamic.getProxy(); 
    dynamicPlayer.login("wangwu", "1234"); 
    dynamicPlayer.killBoss(); 
    dynamicPlayer.upgrade(); 
    /* 
     * 面向切面: 一些類似的營業邏輯須要加在浩瀚的處所,那們便可以把它提取到切面中, 切面也就是事務切面:如日記切面、權限切面、營業切面 
     */ 
  } 
} 

打印:

開端時光是:2014-10-8 17:19:05 
登錄名為zhangSan 的腳色 X登錄勝利! 
X 在打怪! 
X 又升了一級! 
停止時光是:2014-10-8 17:19:05 
 
登錄時光是:2014-10-8 17:19:05 
登錄名為lisi 的腳色 M登錄勝利! 
M 在打怪! 
M 又升了一級! 
進級時光是:2014-10-8 17:19:05 
 
我是一位代練,我玩的腳色是他人的,可以靜態傳遞出去 
登錄時光是:2014-10-8 17:19:05 
登錄名為wangwu 的腳色 Y登錄勝利! 
Y 在打怪! 
進級時光是:2014-10-8 17:19:05 
Y 又升了一級! 


 長處 
 (1)職責清楚
 真實的腳色就是完成現實的營業邏輯,不消關懷其他非本職責的事務,經由過程前期的署理完成一件完成事務,附帶的成果就是編程簡練清楚。
 (2)署理對象可以在客戶端和目的對象之間起到中介的感化,如許起到了的感化和掩護了目的對象的感化。
 (3)高擴大性

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved