(@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 }

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

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

原文地址:https://www.cnblogs.com/WhiteTaken/p/7696475.html