代理模式Proxy (非常容易看懂)
代理模式有静态代理模式和动态代理模式
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 (非常容易看懂)相关推荐
- 代理模式(Proxy)简介
代理模式相对来讲比较简单和容易理解. 一, 代理模式(Proxy)的定义 教材里定义很简单: 所谓代理模式, 就是为其他对象提供一种代理控制对这个对象的访问. 上面出现了3个名词: 1.其他对象 2. ...
- Java24种设计模式(第二种)--代理模式(Proxy Pattern)
Java24种设计模式 (第二种) 一.代理模式(Proxy Pattern) 模式逻辑: 什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道 被代理人能做哪些事 ...
- 二十四种设计模式:代理模式(Proxy Pattern)
代理模式(Proxy Pattern) 介绍 为其他对象提供一个代理以控制对这个对象的访问. 示例 有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这 ...
- 二十三种设计模式(第十二种)-----代理模式(Proxy)
二十三种设计模式(第十二种)-----代理模式(Proxy) 尚硅谷视频连接https://www.bilibili.com/video/BV1G4411c7N4?from=search&se ...
- [Java] 代理模式 Proxy Mode
[Java] 代理模式 Proxy Mode 文章目录 [Java] 代理模式 Proxy Mode 1. 代理思想 2.java.lang.reflect.Proxy类 2.1 利用反射创建prox ...
- 设计模式——代理模式(Proxy Pattern)之为别人做嫁衣
代理模式Proxy Pattern 代理模式 1.背景 2.定义 3.特征 4.应用场景 5.实验案例 参考 代理模式 1.背景 假如说我现在想租一间房子,虽然我可以自己去找房源,做卫生检测等一系列的 ...
- 设计模式-代理模式(Proxy Pattern)
设计模式-代理模式(Proxy Pattern) 文章目录 设计模式-代理模式(Proxy Pattern) 一.定义 二.概念解释 三.场景 四.实现 1.类图 2.代码实现 五.小结 六.动态代理 ...
- js设计模式——代理模式proxy
什么是代理模式 代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问. (可以想象一下明星与经纪人的关系,明星是请求的本体,经纪人就是代理proxy) 如何实现代理模式 代理对象内部含有对本 ...
- 一文彻底搞懂代理模式(Proxy)
代理模式 引言 代理模式的定义与特点 代理模式的结构 模式实现 静态代理 动态代理 总结 与装饰者模式 文章已收录我的仓库:Java学习笔记与免费书籍分享 代理模式 引言 代理模式是非常常见的模式,在 ...
最新文章
- python约束 与MD5加密写法
- OpenGL camera相机的实例
- boc android app,BOC
- /etc/services
- 开发app用户协议_APP软件开发如何让用户更开心地付钱?
- 12步轻松搞定python装饰器
- java io之图片存取
- C++参考的翻译或校对
- 马云:创业成功者没有固定模式
- 软件项目管理实用教程(人民邮电出版)第四章课后习题
- SwiftyJSON 如何使用
- 如何编写干净的Java代码
- Maple拥有优秀的符号计算和数值计算能力
- 计算机音乐数字大全抖音,抖音歌曲大全100首,抖音最火的100首音乐
- 神经网络模型(.pth)能做些什么(使用心得)
- 用null_blk工具来实现模拟分区块设备
- 物联网关键技术:时序数据库
- 显示器U2518怎么连服务器,【戴尔 U2518D 显示器使用感受】尺寸|分辨率|边框|底座|颜色_摘要频道_什么值得买...
- 网络舆情危及企业经营如何应对?舆情优化十大解决方案!
- Exchange笔记之Exchange2010部署实施
热门文章
- 【读点论文】生成对抗网络 GAN
- 【PyTorch】1入门——Tensor、自动微分、神经网络、PyTorch 图像分类
- 【附源码】计算机毕业设计JAVA个性化推荐的扬州农业文化旅游管理平台
- 使用overleaf在线编译latex出现no pdf问题
- Python 实现 DoS 攻击 —— UDP洪水攻击
- 随机获取小区/酒店名称
- Uva 514 Rails
- 无法将“pytest”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
- Android input 系统InputReader,InputDispatcher线程实例--UI死掉
- 我的计算机桌面被分成三格,用四宫格管理你的电脑桌面,工作效率蹭蹭蹭的提高...