接口的应用:代理模式(Proxy)浅谈 您所在的位置:网站首页 权限角色是什么意思啊 接口的应用:代理模式(Proxy)浅谈

接口的应用:代理模式(Proxy)浅谈

2024-07-10 10:02| 来源: 网络整理| 查看: 265

概述

代理模式是Java开发中使用较多的一种设计模式。 代理设计就是为其他对象提供一种代理以控制对这个对象的访问。

代理模式的使用场景:

1)安全代理:屏蔽对真实角色的直接访问(不让被代理类对象暴露出去)。 2) 远程代理:通过代理类处理远程方法调用(RMI) 3) 延迟加载:先加载轻量级的代理对象,真正需要再加载真实对象 。比如你要开发一个大文档查看软件,大文档中有大的图片,有可能一个图片有 100MB,在打开文件时,不可能将所有的图片都显示出来,这样就可以使用代理模式,当需要查看图片时,用proxy来进行大图片的打开。

代理模式的分类

1) 静态代理(静态定义代理类) 2) 动态代理(动态生成代理类) 注意: JDK自带的动态代理,需要反射等知识 区别: 动态代理: 写代码的时候不显式的把代理类写出来,在代码执行过程中动态 的生成一个代理类对象 静态代理: 针对不同的接口定义相应的代理类,代理类是专门针对这一个接口的代理类

理解:

比如:有一个接口叫做Object(不是我们通常所说的类Object),这个接口被ObjectImpl(称为被代理类)和ProxyObject(称为代理类)这两个类给实现了。 形象的说:Object代表租房子这件事,定义成了接口。实际上是我们自己想去找房子,我们自己就相当于是被代理类,但由于多种原因我们没时间自己去找,所以我们找了中介,中介就相当于是代理类。即通过代理类帮我们去做事,要求是代理类和被代理类都要实现接口,只是接口中的抽象方法实现的时候有所区别,本来是被代理类要做的事,通过代理类帮他完成,代理类会调用被代理类的有关方法,静态代理的话如果还有一个叫做买菜的接口,那就是另外一套代理类了。

以下代码都是静态代理

例子1:

package test; public class Test2 { public static void main(String[] args) { Server server=new Server(); ProxyServer proxyserver=new ProxyServer(server); proxyserver.browse();//形式上是调了代理类对象的方法,实际上在其方法体中调了被代理类的方法 //在代码层面server并没有显示的去调用browse } } interface NetWork{ public void browse();//browse指的是浏览 } //被代理类 class Server implements NetWork{ @Override public void browse() { System.out.println("真实的服务器来访问网络"); } } //代理类,proxy是代理的意思 class ProxyServer implements NetWork{ private NetWork work;//私有化接口引用变量 //提供当前代理类的构造器 public ProxyServer(NetWork work) { this.work=work; } public void check() { System.out.println("联网之前的检查工作"); } @Override public void browse() { check(); work.browse(); } }

例子2:

package test01; public class test { public static void main(String[] args) { Star s = new Proxy(new RealStar());//也可以写成Proxy s = new Proxy(new RealStar()) s.confer(); s.signContract(); s.bookTicket(); s.sing();//实际上在方法体中调了明星的sing方法 s.collectMoney(); } } interface Star { void confer();// 面谈 void signContract();// 签合同 void bookTicket();// 订票 void sing();// 唱歌 void collectMoney();// 收钱 } //被代理类,明星 class RealStar implements Star { public void confer() { } public void signContract() { } public void bookTicket() { } public void sing() { System.out.println("唱歌"); } public void collectMoney() { } } //代理类,经纪人 class Proxy implements Star { private Star real;//套路 public Proxy(Star real) { this.real = real;//套路 } public void confer() { System.out.println("经纪人面谈"); } public void signContract() { System.out.println("经纪人签合同"); } public void bookTicket() { System.out.println("经纪人订票"); } public void sing() { real.sing(); } public void collectMoney() { System.out.println("经纪人收钱"); } }


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有