Java代理模式——静态代理模式

时间:2022-12-04 16:37:50

一:代理模式

代理模式的作用是:为其他对象提供一种代理以控制这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

二:代理模式设计到的角色

抽象角色:声明真是对象和代理对象的共同接口(抽象类或接口)。

代理角色:代理对象角色内部含有对真是对象的引用,从而可以操作真是对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能够代替真是对象。同时,代理对象可以在执行真实对象的操作时,附加其他操作,相当于对真是对象进行封装。

真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。

三:案例演示之一 

抽象角色:(抽象类)

Java代理模式——静态代理模式

真实角色:

Java代理模式——静态代理模式

代理角色:

Java代理模式——静态代理模式

客户端:

Java代理模式——静态代理模式

四:案例演示之二 

抽象角色:(接口)

Java代理模式——静态代理模式

真实角色:

Java代理模式——静态代理模式

代理角色:

Java代理模式——静态代理模式

代理角色之附加操作类:

Java代理模式——静态代理模式

客户端代码:

Java代理模式——静态代理模式

如果我们使用spring来做,那么需要做如下改动:

添加spring配置文件:

Java代理模式——静态代理模式

客户端代码:

Java代理模式——静态代理模式

五:总结归纳 

案例演示一:

如果要按照上述的方式(静态代理)使用代理模式,那么真实角色必须是实现已经存在的,并将其作为代理对象的内部属性。

   但是实际使用时,一个真实角色必须对应一个代理角色,但如果大量使用会导致类的急剧膨胀;此外,如果事先并不知道真实角色,该如何使用代理呢?这个问 题可以通过Java的动态代理类来解决(后续我的一个目录【JDK动态代理与CGLIB动态代理中将会讲到】)。

案例演示二:

静态代理的缺点:

1.如果有100个Dao,则要创建100个代理对象。

2.如果一个Dao中有很多方法需要事务,则代理对象中的方法中重复代码还是很多。

3.由第一点和第二点可以得出:静态proxy的重用性不强。

当然静态代理也有自己的有点,比如代码增强,等等。

1、静态代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大量的代码重复。如果接口增加一个方法,除了所有实现类需要实现这个方 法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。

2、静态代理对象只服务于一种类型的对象,如果要服务多类型的对象。势必要为每一种对象都进行代理,静态代理在程序规模稍大时就无法胜任了。