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

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

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

(@WhiteTaken)设计模式学习——代理模式相关推荐

  1. swift设计模式学习 - 代理模式

    移动端访问不佳,请访问我的个人博客 设计模式学习的demo地址,欢迎大家学习交流 代理模式 代理模式为其他对象提供一种代理以控制对这个对象的访问,在某些情况下,一个对象不适合或者不能直接引用另一个对象 ...

  2. JS设计模式学习 - 代理模式

    代理模式(Proxy) 为一个对象提供一个代用品或占位符,以便控制对它们的访问. 代理模式是一种非常有意义的模式,在生活中可以找到很多代理模式的场景.比如,明星都有经纪人作为代理. 代理模式的关键是, ...

  3. 设计模式学习——代理模式(Proxy Pattern)

    放假啦~学生们要买车票回家了,有汽车票.火车票,等.但是,车站很远,又要考试,怎么办呢?找代理买啊,虽然要多花点钱,但是,说不定在搞活动,有折扣呢~ 1 /// 2 /// @file Selling ...

  4. 「补课」进行时:设计模式(5)——从 LOL 中学习代理模式

    1. 前文汇总 「补课」进行时:设计模式系列 2. 从 LOL 中学习代理模式 我是一个很喜欢玩游戏的人,虽然平时玩游戏的时间并不多,但我也是一个忠实的 LOL 的爱好者,就是段位有点惨不忍睹,常年倔 ...

  5. 设计模式——从 LOL 中学习代理模式

    从 LOL 中学习代理模式 我是一个很喜欢玩游戏的人,虽然平时玩游戏的时间并不多,但我也是一个忠实的 LOL 的爱好者,就是段位有点惨不忍睹,常年倔强的黑铁,今年 S10 的总决赛在上海举行,这个事儿 ...

  6. 设计模式:代理模式(C++)【代理服务器案例】

    代理模式介绍 今天继续学习设计模式,今天我们来学习代理模式.其实这个模式呢在我们的生活早已经运用起来了.笔者看到这个模式就联想到了代理商.我们客户买东西一般都是经过代理商的,代理商和真正的生成产品的公 ...

  7. Javascript 设计模式之代理模式【讲师辅导】-曾亮-专题视频课程

    Javascript 设计模式之代理模式[讲师辅导]-969人已学习 课程介绍         随着 javascript ES6/7 的发布,很多老版本的设计模式的实现,今天来看是错误的,将被彻底. ...

  8. 23种设计模式之代理模式

    文章目录 代理模式的定义与特点 代理模式的结构与实现 模式的结构 模式的实现 代理模式的应用场景 代理模式的应用实例 代理模式的扩展 代理模式分类 静态代理 动态代理 在有些情况下,一个客户不能或者不 ...

  9. 从零开始单排学设计模式「代理模式」青铜 III

    阅读本文大概需要 3.2 分钟. 本篇是设计模式系列的第六篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统. 所以现在打算重写,加上距离现在也有一段时间了 ...

最新文章

  1. 水声定位中的CBF波束形成原理
  2. 基于js对象,操作属性、方法详解
  3. 4线电子围栏安装示意图_电子围栏报警系统安装施工过程(图解)
  4. Python实现Adaboost
  5. spoj839 Optimal Marks(最小割,dinic)
  6. bash shell基础之二条件判断
  7. python字符串(in 和not in)(一分钟读懂)
  8. 未来的 AI 芯片将提升百倍性能!
  9. python批量下载pdf
  10. java项目包名理解
  11. excel表格数字显示不全_Excel表格中输入数字最后几位数变成0的解决方法
  12. 用了很多群控与云控,微信还是慢慢死掉了
  13. 一个案例,看懂用户画像如何做出效益
  14. 沉浸式体验,文化与科技融合创新的新业态
  15. Linux服务器开发,手把手设计实现epoll
  16. 实例学习Ansible系列:颜色与设定
  17. 华为机试 - 出错的或电路
  18. 美元指数回落美债收益率下跌,金价未能实现五连涨
  19. 《LeetCode零基础指南》(第十一讲) 遇到不会的题怎么办?
  20. CodeForces 1000A Codehorses T-shirts

热门文章

  1. 如何让ul的符号隐藏_亚马逊关键词大师,那些你不知道的隐藏keywords操作方法(干货)...
  2. JavaScript文档对象模型document对象改变Html元素内容(3)
  3. 试题3 基础练习 数列排序
  4. Unity3D之NGUI基础5.1:代码控制UISprite
  5. bzoj 2987: Earthquake(类欧几里得)
  6. python深度学习库keras——安装
  7. 【python基础语法】range() 序列类型range
  8. 云免等候服务器响应,云服务器响应
  9. 01219 oracle,ORA-01219: 数据库或可插入数据库未打开: 仅允许在固定表或视图中查询 oracle...
  10. 伯努利分布方差_学计量经济学,你应该知道的六种6个概率分布