代理模式:
实际主题类:
所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式是一种结构性设计模式。当客户端不想直接调用主题对象,而希望主题对象的行为前后加上预处理或者后续处理时,则可以使用代理模式。
代理模式的三种角色:主题抽象类、实际主题类、代理类。
主题抽象类:
package com.yihai.spring.proxy;
public abstract class Subject {
//主题抽象类定义了主题对象的行为,下面的例子中主题抽象类定义了主题对象的request行为。
public abstract void request();
}
实际主题类:
package com.yihai.spring.proxy;
//实际主题类继承了抽象主题类Subject,实现了抽象主题类中的行为request。实际主题类就是AOP中的目标对象。
public class RealSubject extends Subject {
@Override
public void request() {
System.out.println("RealSubject--实际主题类");
}
}
代理类:
package com.yihai.spring.proxy;
/**
* 代理类继承了抽象主题类,同时关联了实际主题类。代理类中定义了
* preRequest和postRequest方法,对实际主题类中的request
* 方法实施了控制。代理类对应Spring AOP中的ProxyFactoryBean
* 类,用来生成代理对象。
*/
public class ProxySubject extends Subject {
//代理类关联实际主题类
private RealSubject realSubject;
@Override
public void request() {
preRequest();//自定义的方法,方法中可以实现一些想在请求之前就要完成的逻辑
if(realSubject==null){
realSubject = new RealSubject();
}
realSubject.request();
postRequest();//自定义的方法,方法中可以实现一些想在请求之后想要完成的逻辑
}
//自定义方法:代理之前完成的逻辑
private void preRequest() {
System.out.println("--------------代理之前完成的业务逻辑输出------------");
}
//自定义方法:代理之后完成的逻辑
private void postRequest() {
System.out.println("--------------代理之后完成的业务逻辑输出-------------");
}
//main方法
public static void main(String[] args) {
ProxySubject proxySubject = new ProxySubject();
proxySubject.request();
}
}