代理模式-静态代理

mac2024-10-21  49

代理模式是指,为其他对象提供一种代理以控制这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户类和目标对象之间起到中介的作用。 换句话说,使用代理对象,是为了在不修改目标对象的基础上,增强主业务逻辑。 客户类真正想要访问的对象是目标对象,但客户类真正可以访问的对象是代理对象。客户类对目标对象的访问是通过访问代理对象来实现的。当然,代理类与目标类要实现同一个接口。

根据代理关系建立的时间不同,可以将代理分为两类:静态代理与动态代理。 静态代理是指,代理类在程序运行前就已经定义好,其与目标类的关系在程序运行前就已经确立。

组成 抽象角色:通过接口或抽象类声明真实角色实现的业务方法。 代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。 真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。

(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(); }

客户端实际上直接面对的是代理角色。动态代理可以解决这种情况:静态代理模式有一个不好的地方,使用静态代理,将真实对象作为代理对象内部的属性,一个真实对象必须要对应一个代理对象,当有很多的真实对象需要代理,会有大量的与之对应的代理对象

希望对你有帮助,祝你有一个好心情,加油!

若有错误、不全、可优化的点,欢迎纠正与补充!

最新回复(0)