Java设计模式之代理模式(静态代理部分)

代理模式为某个对象提供一个代理,以控制对这个对象的访问。 代理类和委托类有共同的父类或父接口

,这样在任何使用委托类对象的地方都可以用代理对象替代。代理类负责请求的预处理、过滤、将请求分派给委托类处理、以及委托类执行完请求后的后续处理。

图1:代理模式

Java设计模式之代理模式(静态代理部分)

从图中可以看出,代理接口(Subject)、代理类(ProxySubject)、委托类(RealSubject)形成一个“品”字结构。 根据代理类的生成时间不同可以将代理分为静态代理和动态代理两种。 代理模式一般涉及到的角色有:

抽象角色:声明真实对象和代理对象的共同接口,对应代理接口(Subject);

真实角色:代理角色所代表的真实对象,是我们最终要引用的对象,对应委托类(RealSubject);

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

静态代理

由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。

清单1:代理接口

/** * 代理接口。 定义一个leader接口,声明一个签署文件的方法。 */

public interface Leader {

void sign();

}

清单2:委托类,具体处理业务。

/** * 真正执行任务的类,实现了代理接口。 */

public class CEO implements Leader {

@Override public void sign() {

System.out.println("====CEO 签署文件====");

}

}

清单3:静态代理类 同样实现leader接口

public class Assistant implements Leader {

private Leader leader;

public Assistant(Leader leader) {

this.leader = leader;

}

@Override

public void sign() {

System.out.println("接收文件,交给领导");

leader.sign();

System.out.println("传回文件");

}

}

清单4:生成静态代理类工厂

// 静态代理测试

CEO ceo = new CEO();

Leader leader1 = new Assistant(ceo);

leader1.sign();

静态代理类优缺点

优点:业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。

缺点:

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

2)如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。

如在给Leader接口增加了一个reject()方法,那么真实类当然要实现,但是静态代理类也必须实现。

另外,如果要按照上述的方法使用代理模式,那么真实角色(委托类)必须是事先已经存在的,并将其作为代理对象的内部属性。

但是实际使用时,一个真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀;此外,如果事先并不知道真实角色(委托类),该如何使用代理呢?这个问题可以通过我怕下一篇Java的动态代理类来解决。


分享到:


相關文章: