ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

代理模式

2021-04-17 21:04:21  阅读:153  来源: 互联网

标签:Person void 代理 模式 person rent public


一.代理模式

代理模式分为两种

  • 静态代理
  • 动态代理

二.静态代理

  静态代理是代理模式种最简单的一种,如果想要理解代理模式,千万要好好的理解静态代理。

  举一个栗子

  假如你要去租房的话,那你会去找谁,房东?中介?一般来讲,我们是不是会去找中介而不是房东。

  这个租房的这个例子种,我是实际的类(被代理类),而中介是代理类

  在静态代理中,被代理类和代理类都要实现同样的接口。

  以下是简单例子代码

  接口

public interface Rent {
    void rent();
}

  实际的类(被代理类)

public class Person implements Rent {
    @Override
    public void rent() {
        System.out.println("老子要租房子!");
    }
}

  代理类

 1 public class Proxy implements Rent{
 2     private Person person;
 3 
 4     public Proxy() {
 5     }
 6 
 7     public Proxy(Person person) {
 8         this.person = person;
 9     }
10 
11     @Override
12     public void rent() {
13         pay();
14         person.rent();
15     }
16   
17 }

  测试结果

1 public class ProxyTest {
2     public static void main(String[] args) {
3         Person person = new Person();
4         Proxy proxy = new Proxy(person);
5         proxy.rent();
6     }
7 }

  

  以上的就是最简单的静态代理代码。需要注意的有以下几点

  1. 代理类和被代理类都必须实现接口
  2. 代理类需要将被代理类作为内部类,然后在调用被代理类的方法

稍微进阶的栗子,可以在代理类中添加操作而不改变被代理类。

  代理类

 1 public class Proxy implements Rent{
 2     private Person person;
 3 
 4     public Proxy() {
 5     }
 6 
 7     public Proxy(Person person) {
 8         this.person = person;
 9     }
10 
11     @Override
12     public void rent() {
13         pay();
14         person.rent();
15     }
16     public void pay(){
17         System.out.println("老子收了一亿的房租,就不给你");
18     }
19 }

 

 

 三.动态代理

  动态代理是代理模式而中的难点也是重点,相较静态代理,动态代理有不小的优势,比如

  1. 对于静态代理来说,一个类就需要写一个静态代理,比较繁琐
  2. 静态代理的代理是写死的

以下是动态代理的简单栗子

   接口

1 public interface Rent {
2     void rent();
3 }

   被委托类

1 public class Person implements Rent {
2     @Override
3     public void rent() {
4         System.out.println("你大爷的");
5     }
6 }

  委托工具类

 1 public class ProxyInvocationHandler implements InvocationHandler {
 2     private Object target;
 3 
 4     public void setTarget(Object target) {
 5         this.target = target;
 6     }
 7 
 8 
 9     public Object getProxy(){
10         return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
11     }
12     @Override
13     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
14         Object result = method.invoke(target, args);
15         return result;
16     }
17 }

  测试类

1 public class ProxyTest {
2     public static void main(String[] args) {
3         Person person = new Person();
4         ProxyInvocationHandler pih = new ProxyInvocationHandler();
5         pih.setTarget(person);
6         Person proxy = (Person) pih.getProxy();
7         person.rent();
8     }
9 }

 

标签:Person,void,代理,模式,person,rent,public
来源: https://www.cnblogs.com/chaogechaoge/p/14671176.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有