zoukankan      html  css  js  c++  java
  • (@WhiteTaken)设计模式学习——代理模式

    今天学习了一下代理模式,代理模式分为很多种。目前感觉有两种是需要学习一下的。

    • 静态代理模式
    • 动态代理模式

    1. 静态代理模式

      需要被代理的类,实现一个或者多个接口。

      代理类需要实现被代理类的接口,在此时就可以对这个接口中的方法进行一些操作。

      还是直接上代码吧。

    IPerson接口类。

     1 public interface IPerson { 2 public void buyHouse(); 3 } 

    Man类,实现buyHouse方法。

    1 public class Man implements IPerson {
    2     @Override
    3     public void buyHouse() {
    4         System.out.println("准备买房了,然而钱并不够");
    5     }
    6 }

    PersonProxy类,实现IPerson接口,同时在不修改man对象中的方法的情况下,对man的buyHouse方法进行了修饰。

     1 import java.nio.channels.NonWritableChannelException;
     2 
     3 public class PersonProxy implements IPerson {
     4     private Man man;
     5 
     6     public void setMan(Man man) {
     7         this.man = man;
     8     }
     9     
    10     @Override
    11     public void buyHouse() {
    12         if(null == man){
    13             man = new Man();
    14         }
    15         man.buyHouse();
    16         watch();
    17         speak();
    18     }
    19     
    20     private void speak(){
    21         System.out.println("代理砍价=======一顿吆喝");
    22     }
    23     
    24     private void watch(){
    25         System.out.println("-----带着看房--------");
    26     }
    27 }

    测试类。

    1 public class MainClass {
    2     public static void main(String[] args) {
    3         PersonProxy personProxy = new PersonProxy();
    4         personProxy.buyHouse();
    5     }
    6 }

    2. 动态代理模式

    动态代理模式,不同于静态代理模式的地方,是不用去实现被代理类的接口,降低了修改接口后的维护代价,Java中JDK有相关的接口实现。

    具体代码如下。

    IPerson接口类和Man类保留。

    MyHander类,对代理这件事进行了操作。核心就是method.invoke方法。

     1 package com.whitetaken.test;
     2 
     3 import java.lang.reflect.InvocationHandler;
     4 import java.lang.reflect.Method;
     5 
     6 public class MyHandler implements InvocationHandler {
     7     private Man man;
     8     
     9     public void setMan(Man man) {
    10         this.man = man;
    11     }
    12     @Override
    13     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    14         Object result = null;
    15         if(null == man){
    16             man = new Man();
    17         }
    18         result = method.invoke(man, args);
    19         speak();
    20         watch();
    21         return result;
    22     }
    23     
    24     private void speak(){
    25         System.out.println("代理砍价=======一顿吆喝");
    26     }
    27     
    28     private void watch(){
    29         System.out.println("-----带着看房--------");
    30     }
    31 }

    测试类。

     1 package com.whitetaken.test;
     2 
     3 import java.lang.reflect.Proxy;
     4 
     5 public class MainClass {
     6     public static void main(String[] args) {
     7         Man man = new Man();
     8         MyHandler myHandler = new MyHandler();
     9         myHandler.setMan(man);
    10         IPerson person = (IPerson)Proxy.newProxyInstance(man.getClass().getClassLoader(), man.getClass().getInterfaces(), myHandler);
    11         person.buyHouse();
    12     }
    13 }

    以上两种模式的测试结果一致。

    每天一点小进步,聚沙成塔-_-!!!

  • 相关阅读:
    bzoj 1017 魔兽地图DotR
    poj 1322 chocolate
    bzoj 1045 糖果传递
    poj 3067 japan
    timus 1109 Conference(二分图匹配)
    URAL 1205 By the Underground or by Foot?(SPFA)
    URAL 1242 Werewolf(DFS)
    timus 1033 Labyrinth(BFS)
    URAL 1208 Legendary Teams Contest(DFS)
    URAL 1930 Ivan's Car(BFS)
  • 原文地址:https://www.cnblogs.com/WhiteTaken/p/7696475.html
Copyright © 2011-2022 走看看