[b]静态代理模式的角色:[/b]
抽象角色:声明真实角色和代理角色的接口;
真实角色: 最终要引用的对象
代理角色:持有一个真实角色的引用
一个房东(真实角色),一个中介(代理角色),都能实现卖房子这个动作(接口中的抽象方法)。
但只有房东有房子,它一定能卖房子,但中介必须与房东交互才能卖掉房子(必须持有真实角色的引用)。
1.抽象角色:Subject.java
2.真实角色:RealSubject.java
3.代理角色:ProxySubject.java
4.客户端:Client.java
静态代理虽然也能实现一个代理真实多个真实角色,但每增加一个真实现角色就必须实现真实角色的接口,并添加对应的方法,角色一多就混乱了。
在实际应用中,通常是一个真实角色对应一个代理角色。此外,如果事先并不知道真实角色,该如何使用代理呢?这个问题可以通过Java的动态代理类实现。
抽象角色:声明真实角色和代理角色的接口;
真实角色: 最终要引用的对象
代理角色:持有一个真实角色的引用
一个房东(真实角色),一个中介(代理角色),都能实现卖房子这个动作(接口中的抽象方法)。
但只有房东有房子,它一定能卖房子,但中介必须与房东交互才能卖掉房子(必须持有真实角色的引用)。
1.抽象角色:Subject.java
package proxy;
public abstract class Subject
{
public abstract void request();
}
2.真实角色:RealSubject.java
package proxy;
public class RealSubject extends Subject
{
public void request()
{
System.out.println("From real subject.");
}
}
3.代理角色:ProxySubject.java
package proxy;
public class ProxySubject extends Subject
{
//代理角色内部引用了真实角色
private RealSubject realSubject = new RealSubject();
public void request()
{
//在真实角色操作之前所附加的操作
this.preRequest();
//真实角色所完成的事情
realSubject.request();
//在真实角色操作之后所附加的操作
this.postRequest();
}
private void preRequest()
{
System.out.println("pre request");
}
private void postRequest()
{
System.out.println("post request");
}
}
4.客户端:Client.java
package proxy;
public class Client
{
public static void main(String[] args)
{
Subject subject = new ProxySubject();
subject.request();
}
}
静态代理虽然也能实现一个代理真实多个真实角色,但每增加一个真实现角色就必须实现真实角色的接口,并添加对应的方法,角色一多就混乱了。
在实际应用中,通常是一个真实角色对应一个代理角色。此外,如果事先并不知道真实角色,该如何使用代理呢?这个问题可以通过Java的动态代理类实现。