代理模式有静态代理模式和动态代理模式

1.静态代理模式:

这个例子举得太好了:助理可以做其他事情:预定时间,场地,最后结算费用,但是唱歌的话只能由歌手华仔本人来 

总共有三个类,调用类,代理类,被代理类

从这辐图里面你要得到两个信息

(1)代理类和被代理的类实现同一个接口request()

(2) 代理类除了实现接口里面的方法之外,还额外有自己的其他方法,比如这里的afterRequest方法和preRequest方法,显然这样扩展了被代理类的功能

一个很详细详细的例子:

总结就是:不再直接调用类C的function1方法

而是先调类B的function1方法,然后在类B的function1方法中调用类C的func1方法,直接调用变成间接调用

public interface D
{public void  function1();
}class C implement D
{@Overridepublic void  function1(){System.out.println("111111");}
}class B implement D
{private C c;//构造方法public B(C c){this.c=c;}@Overridepublic void  function1(){c.function1();} @Overridepublic void  function2(){System.out.println("2222222");}
}public class A
{public static void main(String[] args){C c=new C();B b=new B(c);b.function1(); }
}

2.动态代理(也叫jdk代理)

总结:业务接口中增加方法,增加功能

但是代理类这个类里面一行代码都不用改

也就是说代理类可以根据你要调用的方法,来进行变化,最后让你成功的调用方法

agent.show()可以,agent.dance()也可以,agent.show()也可以

public  interface SuperStar
{public void  sing();}public  class  SuperStarLiu   implements   SuperStar
{@Overridepublic    void    sing(){System.out.println("我是刘德华,我正在表演唱歌.......");}
}public  class  SuperStarZhou  implements   SuperStar
{@Overridepublic    void    sing(){System.out.println("我是周润发,我正在表演唱歌.......");}}//动态代理类Proxy
public   class  Proxy
{SuperStar  target;public   Proxy()//构造方法{this.target=target;}//返回一个动态代理对象,由于这个对象可以是任意类型,所以返回值是Object类型public  Object    getAgent(){return  Proxy.newProxyInstance(loader,intrtfances,h:);//固定写法,记住就行//loader换成target.getClass().getClassLoader()//interfaces换成target.getClass().getInterfaces()//h:换成//new  InvocationHandler(){@Overridepublic   Object  invoke(Object  proxy,Method   method,Object[]   args){System.out.println("预定时间......");System.out.println("预定场地......");method.invoke(target,args);//这行代码封神了,这句代码既可以调用target.sing(),又可以调用target.show(),还可以调用target.dance(),非常灵活,可以调用任何方法System.out.println("结算费用......");return obj;}}}
}//第一个测试代码:
Proxy  proxy=new  Proxy(new  SuperStarZhou());
SuperStar agent=(SuperStar) proxy.getAgent();
agent.sing();//得到输出结果如下:
//预定时间......
//预定场地......
//我是周润发,我正在表演唱歌.......
//结算费用........

//第二个测试代码:
此时,如果在业务接口中增加一个方法(增加一个功能):
public  String  show(int age);public  interface SuperStar
{public void  sing();public  String  show(int age);}SuperStarLiu类和 SuperStarZhou类都要重写这个方法
比说:
public  class  SuperStarLiu   implements   SuperStar
{@Overridepublic    void    sing(){System.out.println("我是刘德华,我正在表演唱歌.......");}@Overridepublic String  show(int  age){System.out.println("刘德华的show......."+age);return  "liu";  }}但是,代理类中一行代码都不用改Proxy  proxy=new  Proxy(new  SuperStarLiu());SuperStar agent=(SuperStar) proxy.getAgent();agent.show(60);//得到输出结果如下:
//预定时间......
//预定场地......
//周润发的show.......66
//结算费用........//如果想看agent.show(60)的返回值,可以:
String  s=agent.show(60);
System.out.println(s);
//liu

代理模式Proxy (非常容易看懂)相关推荐

  1. 代理模式(Proxy)简介

    代理模式相对来讲比较简单和容易理解. 一, 代理模式(Proxy)的定义 教材里定义很简单: 所谓代理模式, 就是为其他对象提供一种代理控制对这个对象的访问. 上面出现了3个名词: 1.其他对象 2. ...

  2. Java24种设计模式(第二种)--代理模式(Proxy Pattern)

    Java24种设计模式 (第二种) 一.代理模式(Proxy Pattern) 模式逻辑: 什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道 被代理人能做哪些事 ...

  3. 二十四种设计模式:代理模式(Proxy Pattern)

    代理模式(Proxy Pattern) 介绍 为其他对象提供一个代理以控制对这个对象的访问. 示例 有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这 ...

  4. 二十三种设计模式(第十二种)-----代理模式(Proxy)

    二十三种设计模式(第十二种)-----代理模式(Proxy) 尚硅谷视频连接https://www.bilibili.com/video/BV1G4411c7N4?from=search&se ...

  5. [Java] 代理模式 Proxy Mode

    [Java] 代理模式 Proxy Mode 文章目录 [Java] 代理模式 Proxy Mode 1. 代理思想 2.java.lang.reflect.Proxy类 2.1 利用反射创建prox ...

  6. 设计模式——代理模式(Proxy Pattern)之为别人做嫁衣

    代理模式Proxy Pattern 代理模式 1.背景 2.定义 3.特征 4.应用场景 5.实验案例 参考 代理模式 1.背景 假如说我现在想租一间房子,虽然我可以自己去找房源,做卫生检测等一系列的 ...

  7. 设计模式-代理模式(Proxy Pattern)

    设计模式-代理模式(Proxy Pattern) 文章目录 设计模式-代理模式(Proxy Pattern) 一.定义 二.概念解释 三.场景 四.实现 1.类图 2.代码实现 五.小结 六.动态代理 ...

  8. js设计模式——代理模式proxy

    什么是代理模式 代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问. (可以想象一下明星与经纪人的关系,明星是请求的本体,经纪人就是代理proxy) 如何实现代理模式 代理对象内部含有对本 ...

  9. 一文彻底搞懂代理模式(Proxy)

    代理模式 引言 代理模式的定义与特点 代理模式的结构 模式实现 静态代理 动态代理 总结 与装饰者模式 文章已收录我的仓库:Java学习笔记与免费书籍分享 代理模式 引言 代理模式是非常常见的模式,在 ...

最新文章

  1. python约束 与MD5加密写法
  2. OpenGL camera相机的实例
  3. boc android app,BOC
  4. /etc/services
  5. 开发app用户协议_APP软件开发如何让用户更开心地付钱?
  6. 12步轻松搞定python装饰器
  7. java io之图片存取
  8. C++参考的翻译或校对
  9. 马云:创业成功者没有固定模式
  10. 软件项目管理实用教程(人民邮电出版)第四章课后习题
  11. SwiftyJSON 如何使用
  12. 如何编写干净的Java代码
  13. Maple拥有优秀的符号计算和数值计算能力
  14. 计算机音乐数字大全抖音,抖音歌曲大全100首,抖音最火的100首音乐
  15. 神经网络模型(.pth)能做些什么(使用心得)
  16. 用null_blk工具来实现模拟分区块设备
  17. 物联网关键技术:时序数据库
  18. 显示器U2518怎么连服务器,【戴尔 U2518D 显示器使用感受】尺寸|分辨率|边框|底座|颜色_摘要频道_什么值得买...
  19. 网络舆情危及企业经营如何应对?舆情优化十大解决方案!
  20. Exchange笔记之Exchange2010部署实施

热门文章

  1. 【读点论文】生成对抗网络 GAN
  2. 【PyTorch】1入门——Tensor、自动微分、神经网络、PyTorch 图像分类
  3. 【附源码】计算机毕业设计JAVA个性化推荐的扬州农业文化旅游管理平台
  4. 使用overleaf在线编译latex出现no pdf问题
  5. Python 实现 DoS 攻击 —— UDP洪水攻击
  6. 随机获取小区/酒店名称
  7. Uva 514 Rails
  8. 无法将“pytest”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
  9. Android input 系统InputReader,InputDispatcher线程实例--UI死掉
  10. 我的计算机桌面被分成三格,用四宫格管理你的电脑桌面,工作效率蹭蹭蹭的提高...