代理模式是指,为其他对象提供一种代理以控制这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户类和目标对象之间起到中介的作用。
换句话说,使用代理对象,是为了在不修改目标对象的基础上,增强主业务逻辑。
客户类真正想要访问的对象是目标对象,但客户类真正可以访问的对象是代理对象。客户类对目标对象的访问是通过访问代理对象来实现的。当然,代理类与目标类要实现同一个接口。
根据代理关系建立的时间不同,可以将代理分为两类:静态代理与动态代理。
静态代理是指,代理类在程序运行前就已经定义好,其与目标类的关系在程序运行前就已经确立。
组成
抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
(1)定义业务接口GameService,其中含有抽象方法gameStart()。
public interface GameService {
//主业务逻辑
void gameStart();
}
(2)定义目标类GameServiceImpl,该类实现了业务接口。在对接口方法的实现上,只实现主业务逻辑即可。这个方法称为目标方法。
public class GameServiceImpl implements GameService {
//目标方法
@Override
public void gameStart() {
System.out.println("这里调用Dao层,开始记录娱乐进程!!!");
}
}
(3)定义代理类GameServiceImplProxy。这个类要实现GameService接口。并且该代理类要将接口对象作为一个成员变量,还要定义一个带参的构造器,这个参数为接口对象。目的是,将目标对象引入代理类,以便代理类调用目标类的目标方法。
/* 定义代理类,与目标类实现相同的业务接口 */
public class GameServiceImplProxy implements GameService {
//声明业务接口对象
private GameService target;
public GameServiceImplProxy(){}
public GameServiceImplProxy(GameService target){
this.target = target;
}
/* 代理方法,实现对目标方法的功能增强 */
@Override
public void gameStart() {
//此处为对目标类的增强
System.out.println("***验证是否还有钻石***");
target.gameStart();
}
}
(4)定义客户类Client。在客户类中首先要创建目标对象,再创建代理对象,并使用目标对象对其进行初始化。然后由代理对象来调用执行业务方法。
public static void main(String[] args) {
//创建目标对象
GameService target = new GameServiceImpl();
//创建代理对象,并使用目标对象初始化它
GameService service = new GameServiceImplProxy(target);
//此时执行的内容,就是对目标对象增加过的内容
service.gameStart();
}
客户端实际上直接面对的是代理角色。
动态代理可以解决这种情况:静态代理模式有一个不好的地方,使用静态代理,将真实对象作为代理对象内部的属性,一个真实对象必须要对应一个代理对象,当有很多的真实对象需要代理,会有大量的与之对应的代理对象
希望对你有帮助,祝你有一个好心情,加油!
若有错误、不全、可优化的点,欢迎纠正与补充!