<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                代理模式(Proxy):代理模式其實就是多一個代理類出來,替原對象進行一些操作。比如咱有的時候打官司需要請律師,因為律師在法律方面有專長,可以替咱進行操作表達咱的想法,這就是代理的意思。代理模式分為兩類:1、靜態代理(不使用jdk里面的方法);2、動態代理(使用jdk里面的InvocationHandler和Proxy)。下面請看示例: ##一、靜態代理 ### 1、uml建模: ![](https://box.kancloud.cn/2016-02-19_56c7196e4bf51.jpg) ##2、代碼實現 ~~~ /** * 示例(一):代理模式 --靜態代理(沒有調用JDK里面的方法) * * 目標接口 */ interface Targetable { public void targetMethod(); } class Target implements Targetable { @Override public void targetMethod() { System.out.println("this is a target method..."); } } class Proxy implements Targetable { private Target target; public Proxy() { this.target = new Target(); } private void beforeMethod() { System.out.println("this is a method before proxy..."); } private void afterMethod() { System.out.println("this is a method after proxy..."); } /** * 在執行目標方法前后加了邏輯 */ @Override public void targetMethod() { beforeMethod(); target.targetMethod(); afterMethod(); } } /** * 客戶端測試類 * * @author Leo */ public class Test { public static void main(String[] args) { /** * 創建代理對象 */ Targetable proxy = new Proxy(); /** * 執行代理方法 */ proxy.targetMethod(); } } ~~~ ##二、動態代理 ### 1、uml建模: ![](https://box.kancloud.cn/2016-02-19_56c7196e5b442.jpg) ### 2、代碼實現 ~~~ /** * 示例(二):代理模式 --動態代理 * * 以添加用戶為例 */ class User { private String username; private String password; public User() { } public User(String username, String password) { this.username = username; this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User [username=" + username + ", password=" + password + "]"; } } /** * 目標接口 */ interface IUserDao { public void add(User user); } class UserDaoImpl implements IUserDao { @Override public void add(User user) { System.out.println("add a user successfully..."); } } /** * 日志類 --> 待織入的Log類 */ class LogEmbed implements InvocationHandler { private IUserDao target; /** * 對target進行封裝 */ public IUserDao getTarget() { return target; } public void setTarget(IUserDao target) { this.target = target; } private void beforeMethod() { System.out.println("add start..."); } private void afterMethod() { System.out.println("add end..."); } /** * 這里用到了反射 * * proxy 代理對象 * * method 目標方法 * * args 目標方法里面參數列表 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { beforeMethod(); // 回調目標對象的方法 method.invoke(target, args); System.out.println("LogEmbed --invoke-> method = " + method.getName()); afterMethod(); return null; } } /** * 客戶端測試類 * * @author Leo */ public class Test { public static void main(String[] args) { IUserDao userDao = new UserDaoImpl(); LogEmbed log = new LogEmbed(); log.setTarget(userDao); /** * 根據實現的接口產生代理 */ IUserDao userDaoProxy = (IUserDao) Proxy.newProxyInstance(userDao .getClass().getClassLoader(), userDao.getClass() .getInterfaces(), log); /** * 注意:這里在調用IUserDao接口里的add方法時, * 代理對象會幫我們調用實現了InvocationHandler接口的LogEmbed類的invoke方法。 * * 這樣做,是不是有點像Spring里面的攔截器呢? */ userDaoProxy.add(new User("張三", "123")); } } ~~~ ##三、總結 代理模式好處:1、一個代理類調用原有的方法,且對產生的結果進行控制。2、可以將功能劃分的更加清晰,有助于后期維護。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看