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

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

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

  • 相关阅读:
    test
    封装和构造方法
    面向对象
    数组的排序
    UDP编程(八)
    多的是面向对象你不知道的事
    面向对象组合的使用
    类成员的进一步阐述
    面向对象初始
    吾日三省吾身
  • 原文地址:https://www.cnblogs.com/WhiteTaken/p/7696475.html
Copyright © 2020-2023  润新知