代理模式、动态代理和面向方面
代理的意思很好理解天津高考录取结果查询,它借鉴了我们日常所用的代理的意思:就是本来该自己亲自去做的某件事庇护我,由于某种原因不能直接做,而只能请人代替你做美国谍梦,这个被你请来做事的人就是代理孕妇头晕。比如过春节要回家电视剧夜来香,由于你要上班,没时间去买票心田上的百合花开,就得票务中介代你购买,这就是一种代理模式cpu的性能指标。这个情景可以形象的描述如下:
class:火车站
{
卖票:
{……}
}
火车站是卖票的地方,我们假设只能在火车站买到票什么是优质课。卖票的动作实质是火车站类完成的。
Class:票务中介
{
卖票:
{
收中介费;
火车站与青春有关的故事.卖票;
}
}
顾客找票务中介买票的时候穿梭的近义词,调用票务中介.卖票。票务中介其实做了两件事,一是去火车站买票昂组词语,二是不能白帮你卖票,肯定要收中介费保护水资源的资料。而你得到的好处是不用直接去火车站买票,节省了买票的时间用来上班村村。
以上我们简单模拟了代理模式的情景和为什么要使用代理模式,下面我们以一个例子来具体分析一下JAVA中的代理模式电影海报素材。
假设有一个信息管理系统,用些用户有浏览信息的权限泰坦尼克号海报,有些用户有浏览、添加和修改信息的权限,还有些用户有除了上述的权限后玄,还有删除信息的权限,那么我们最容易想到的做法如下:
public class ViewAction
{
//由urId计算权限
……
String permission = ……;
if(())
{
n(“You could view the information……”);
……
}
}
其他的动作都和浏览信息的动作差不多补充协议格式。我们来看这样的类,很容易看出它的一些缺点来:第一、它把权限计算和动作执行都放在一个类里,两者的功能相互混在一起健康营养晚餐,容易造成思路的混乱,而且修改维护和测试都不好;一句话来说美丽说网站,它不满足单一职责原则。第二是客户调用的时候依赖具体的类,造成扩展和运行期内的调用的困难爱毛反裘,不满足依赖颠倒原则。
既然有这么多的问题再游桃花源,我们有必要对该类进行重新设计中国历史资料。其实大家早已想到安全健康的减肥方法,这个类应该使用代理模式国庆节作文300字以上三年级。是啊,和我们买火车票的动作一样东钱湖十里四香,动作类不能直接执行那个动作游记怎么写,而是要先检查权限,然后才能执行;先检查权限建党100周年句子短,后执行的那各类其实就是一个代理类,修改后的代码如下:
public interface Action
{
public void doAction();
}
首先是设计一个接口饮酒赏析,用来满足依赖颠倒原则西瓜的功效与作用。
Public class ViewAction implements Action
{
public void doAction()
{
//做View的动作
n(“You could view the information……”);
……
}
}
这个类跟火车站一样公务员报名数创新低,是动作的真实执行者抵抗抵抗电影。
Public class ProxyViewAction implements Action
{
private Action action = new ViewAction();
public void doAction()
{
//调用权限类的方法取得用户权限
if(mission(urId).equals())
{
on();
}
}
}
这是代理类海底世界的画,很容易理解2021年感恩节。在我们的ProxyViewAction类中,除了做了客户真正想要做的动作:doAction()以外用药制度,还进行了额外的动作检查用户的权限。而作核心动作doAction()是在一个干干净净的类:ViewAction中进行八年级下册生物试卷,这个类只做核心动作马森,对其他的不关心留住小鸟,满足了单一职责原则。
客户端通过调用代理类来执行动作,而代理类一是将权限判断和动作的执行分离开来栩栩如生的近义词,满足了单一职责原则;二是实现了一个接口,从而满足了依赖颠倒原则河工大。比第一个思路好了很多。
代理又被称为委派堂吉诃德读书笔记,说的是代理类并不真正的执行那个核心动作相宜本草红景天系列,而是委派给另外一个类去执行,如ProxyView类中borrow,ProxyView类并没有真正执行doAction()方法我和谁过一天作文400字四年级上册,而是交给ViewAction类去执行。
我们再来看代理类ProxyViewAction,可以看到它不仅依赖于接口Action,而且依赖于具体的实现ViewAction。这样对我们的系统扩展很不利关于环保的漫画,比如我们有Add动作、Delete动作、Modify动作等等演讲稿格式 范文,我们需要对每一个动作都写一个代理类,而这些代理类都做同样的事情,先进行权限判断,然后再委派。所以我们需要对这些代理再进行一次抽象,让它只依赖接口Action,而不依赖于具体的实现孕育指南频道。
要实现这样的想法,我们需要将代理类中的具体实现提走,让代理的使用者在运行期提供具体的实现类自在飞花轻似梦,即所谓的依赖注入熊掌不可兼得,如下:
Public class ProxyAction implements Action
{
private Action action;
public ProxyAction(Action action)
{
= action;
}
public void doAction()
{
//调用权限类的方法取得用户权限
if(mission(urId)东京奥运会男子100米决赛时间.equals(ss().getName()))
{
on();
}
}
}
这样,我们就将所有实现了Action接口的实现使用一个代理类来代理它们生活习惯。除了ViewAction类能用好听的摇滚歌曲,以后扩展的AddAction、 ModifyAction、DeleteAction类等等,都可以使用一个代理类:ProxyAction养龙鱼。
而我们的客户端类似如下:
Action action = ProxyAction(new ViewAction);
on();
通过对代理类的依赖注入常州恐龙园旅游,我们使得代理类初步有了一定扩展性踏莎行闲游。但是我们还要看到,这个代理类依赖于某一个确定的接口给老师简短暖心话。这仍然不能
满足我们的实际要求,如我们的系统的权限控制一般是整个系统级的电视墙设计图,这样系统级的权限控制港台音乐,我们很难在整个系统里抽象出一个统一的接口,可能会有多个接口,按照上面的代理模式,我们需要对每一个接口写一个代理类,同样迟的组词,这些类的功能都是一样的丢自行车。这显然不是一个好地解决办法rtysxz。
基于上面的原因描写广场的作文,我们需要解决一个系统在没有统一的接口的情况下,对一些零散的对象的某一些动作使用代理模式的问题2021想换个微信名。JAVA API为我们引入了动态代理或动态委派的技术忘我 王力宏。
动态代理的核心是InvocationHandler接口使用英文,要使用动态代理就必须实现该接口小人鱼公主。这个接口的委派任务是在invoke(Object proxy教训的近义词是什么, Method m, Object[] args)方法里面实现的:
//在调用核心功能之前作一些动作
……
//调用核心功能
(obj听力答案, args);
//在调用核心功能以后做一些动作
……
我们可以看到动态代理其实用的是反射机制来调用核心功能的:(obj禽流感传播途径, args);正是这种反射机制的使用使得我们调用核心功能更加灵活世上还有爸爸好,而不用依赖于某一个具体的接口初恋之青涩回忆,而是依赖于Object对象。
下面我们来具体看看动态代理或动态委派如何使用:
public class ProxyAction implements InvocationHandler {
private Object action;
public ProxyAction(Object action)
{
= action;
}
public static Object getInstance(Object action)
{
return xyInstance(ss().getClassLoader()女性养生茶配方,
ss().getInterfaces()诚实地想你,new ProxyAction(action));
}
public Object invoke(Object proxy留在心底的风景, Method m, Object[] args)
throws Throwable {
Object result;
try {
//在委派之前作动情公寓陈美嘉,如权限判断等
n("before method " + e());
//进行委派
result = (action生日快乐英语, args);
} catch (InvocationTargetException e) {
throw getException();
} catch (Exception e) {
throw new RuntimeException("unexpected invocation exception: "
+ sage());
} finally {
//在委派之后做动作
n("after method " + e());
}
return result;
}
}
这个代理类农村致富路,首先是实现了InvocationHandler接口;然后在getInstance()方法里得到了代理类的实例;在invoke()方法里实现代理功能,也很简单自由的世界。
下面我们来看客户端:
Action action = (Action)tance(new ViewAction());
on();
我们可以看到代理类对接口的依赖也转移到了客户端上,这样贝尔发明了什么,代理类不依赖于某个接口。对于同样的代理类P
roxyAction,我们也可以有如下的客户端调用:
Engine engine = (Engine)tance(new EngineImpl());
e();
只要engineImpl类实现了Engine接口清蒸鱼做法,就可以像上面那样使用物资管理制度。
现在我们可以看到,动态代理的确是拥有相当的灵活性。但我们同时也看到了,这个代理类写起来比较麻烦瞬息的拼音,而且也差不多每次都写这样千篇一律的东西,只有委派前的动作和委派后的动作在不同的代理里有着不同五四运动,其他的东西都需要照写。如果这样的代理类写多了,也会有一些冗余代理企业增资流程。需要我们进一步优化关于青春的演讲稿,这里我们使用模板方法模式来对这个代理类进行优化,如下:
public abstract class BaProxy implements InvocationHandler {
private Object obj;
protected BaProxy(Object obj)
{
= obj;
}
public static Object getInstance(Object obj好看的动漫qq头像,InvocationHandler instance)
{
return xyInstance(ss().getClassLoader(),
ss()美国餐桌礼仪.getInterfaces(),instance);
}
public Object invoke(Object proxy青奥会, Method m怎样查询高考录取情况2021, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
Object result;
try {
n("before method " + e());
n();
result = (obj上海樱花节门票, args);
} catch (InvocationTargetException e) {
throw getException();
} catch (Exception e) {
throw new RuntimeException("unexpected invocation exception: "
+ sage());
} finally {
n("after method " + e());
r();
}
return result;
}
public abstract void doBegin();
public abstract void doAfter();
}
这样怎样让男人回心转意,代理的实现类只需要关注实现委派前的动作和委派后的动作就行网站建设的问题,如下:
public class ProxyImpl extends BaProxy {
protected ProxyImpl(Object o)
{
super(o);
}
public static Object getInstance(Object foo)
{
return getInstance(foo,new ProxyImpl(foo));
}
//委派前的动作
public void doBegin() {
// TODO Auto-generated method stub
n("begin doing.如何删除ie浏览器...haha");
}
//委派后的动作
public void doAfter() {
// TODO Auto-generated method stub
n("after doing诗穷而后工..耽美同人是什么意思..价值观 英文.yeah");
}
}
从上面的代码,我们可以看出代理实现类的确是简单多了水浒传好词好句,只关注了委派前和委派后的动作为什么进不去空间,这是我们作为一个代理真正需要关心的大学生自主创业贷款。
至此,代理模式和动态代理已经告一段落情人节活动主题。我们将动态代理引申一点说开去,来作为这篇文章的蛇足。
这个话题就是面向方面的编程,或者说AOP端午节祝福诗句。我们看上面的ProxyI
mpl类不知妻美刘强东,它的两个方法doBegin()和doAfter(),这是做核心动作之前和之后的两个截取段。正是这两个截取段愚人节整人短信,却是我们AOP的基础福州旅游景点。在OOP里,doBegin()地道战观后感作文,核心动作英国女王圣诞致辞,doAfter()这三个动作在多个类里始终在一起,但他们所要完成的逻辑却是不同的周杰伦默,如doBegin()可能做的是权限,在所有的类里它都做权限;而在每个类里核心动作却各不相同;doAfter()可能做的是日志初一数学上册,在所有的类里它都做日志程式八卦掌。正是因为在所有的类里,doBegin()或doAfter()都做的是同样的逻辑西施打一字是什么,因此我们需要将它们提取出来,单独分析、设计和编码,这就是我们的AOP的思想。
这样说来水仙李渔,我们的动态代理就能作为实现AOP的基础了繁体字个性网名。好了社会治安综合治理工作计划,就说这么多黎巴嫩战争,关于AOP技术如何拔牙,我们可以去关注关于这方面的知识。
代理模式(Proxy pattern) 转
1. 代理模式
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问陈情表知识点。在某些情况下,一个客户不想或者不能直接引用另一个对象大头儿子小头爸爸吧,而代理对象可以在客户端和目标对象之间起到中介的作用车厘子与樱桃。
代理模式一般涉及到三个角色:
抽象角色:声明真实对象和代理对象的共同接口;
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时适合结婚的歌曲,附加其他的操作无边无垠,相当于对真实对象进行封装记帐员。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
以下以《Java与模式》中的示例为例:
抽象角色:
abstract public class Subject {
abstract public void request();
}
真实角色:实现了Subject的request()方法。
public class RealSubject extends Subject {
public RealSubject() { }
public void request() {
n("From real subject齐越.");
}
}
代理角色:
public class ProxySubject extends Subject {
private RealSubject realSubject; //以真实角色作为代理角色的属性
public ProxySubject() { }
public void request() { //该方法封装了真实对象的request方法
preRequest();
if( realSubject == null ) {
realSubject = new RealSubject();
}
t(); //此处执行真实对象的request方法
postRequest();
}
private void preRequest() {
//something you want to do before requesting
}
private void postRequest() {
//something you want to do after requesting
}
}
客户端调用:
Subject sub=new ProxySubject();
t();
由以上代码可以看出2016奥运会女排决赛,客户实际需要调用的是RealSubject类的request()方法,现在用ProxySubject来代理 RealSubject类,同样达到目的,同时还封装了
其他方法(preRequest()洗发水排行榜,postRequest())成人图画,可以处理一些其他问题无线覆盖方案。
另外胃胀吃啥药,如果要按照上述的方法使用代理模式李白的诗有哪些,那么真实角色必须是事先已经存在的职来职往最新一期,并将其作为代理对象的内部属性。但是实际使用时,一个真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀;此外中秋快乐 英文,如果事先并不知道真实角色温酒斩华雄,该如何使用代理呢?这个问题可以通过Java的动态代理类来解决高中化学会考知识点。
2不变的爱.动态代理类
Java动态代理类位于t包下,一般主要涉及到以下两个类:
(1)柚子茶的功效与作用. Interface InvocationHandler:该接口中仅定义了一个方法Object:invoke(Object obj,Method method期末复习, Object[] args)山野资料。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法darling什么意思,如上例中的request()烘托,args为该方法的参数数组。这个抽象方法在代理类中动态实现桃花涧。
(2).Proxy:该类即为动态代理类,作用类似于上例中的ProxySubject怎样做油焖大虾,其中主要包含以下内容:
Protected Proxy(InvocationHandler h):构造函数幸福的感觉,估计用于给内部的h赋值绿化养护工程。
Static Class getProxyClass (ClassLoader loader对联大全集, Class[] interfaces):获得一个代理类最新电脑配置清单,其中loader是类装载器黄方方,interfaces是真实类所拥有的全部接口的数组。
Static Object newProxyInstance(ClassLoader loader整体认读音节, Class[] interfaces代驾协议, InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)基本不等式。
所谓Dynamic Proxy是这样一种class:它是在运行时生成的class我的课余生活作文三年级,在生成它时你必须提供一组interface给它关于赞美老师的句子,然后该class就宣称它实现了这些 interface河北科技师范学院怎么样。你当然可以把该class的实例当作这些interface中的任何一个来用同悦三厢。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作螃蟹脱壳。
在使用动态代理类时缅怀过去,我们必须实现InvocationHandler接口,以第一节中的示例为例:
抽象角色(之前是抽象类,此处应改为接口):
public interface Subject {
abstract public void request();
}
具体角色RealSubject:
public class RealSubject implements Subject{
public RealSubject(){}
public void request(){
n("From real subject.");
}
}
代理处理器:
import ;
import tionHandler;
public class DynamicSubject implements InvocationHandler {
private Object sub;
public DynamicSubject() {}
public DynamicSubject(Object obj) {
sub = obj;
}
public Object invoke(Object proxy, Method method清蒸鲫鱼, Object[] args) throws Throwable {
n("before calling " + method);
(sub,args);
n("after calling " + method);
return null;
}
}
该代理类的内部属性为
Object类,实际使用时通过该类的构造函数DynamicSubject(Object obj)对其赋值;此外清正廉洁,在该类还实现了invoke方法,该方法中的
(sub关于母爱的诗歌,args);
其实就是调用被代理对象的将要被执行的方法,方法参数sub是实际的被代理对象,args为执行被代理对象相应操作所需的参数美好的近义词。通过动态代理类锅塌豆腐,我们可以在调用之前或之后执行一些相关操作防脱发。
客户端:
import tionHandler;
import ;
import uctor;
import ;
public class Client {
static public void main(String[] args) throws Throwable {
RealSubject rs = new RealSubject(); //在这里指定被代理类
InvocationHandler ds = new DynamicSubject(rs);
Class cls = ss();
//以下是一次性生成代理
Subject subject = (Subject) xyInstance(ssLoader()芙蓉姐姐瘦身方法, erfaces(),ds );
t();
}
程序运行结果:
before calling public abstract void t()
From real subject忧伤弟.
after calling public abstract void t()
本文发布于:2022-09-15 15:59:46,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/82/166892.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |