前言

为某个对象提供一个代理,以控制对这个对象的访问。 代理类和委托类有共同的父类或父接口,这样在任何使用委托类对象的地方都可以用代理对象替代。代理类负责请求的预处理、过滤、将请求分派给委托类处理、以及委托类执行完请求后的后续处理。 

代理接口(Subject)、代理类(ProxySubject)、委托类(RealSubject)

代理接口

public interface Subject {
	String hello();
}

委托类

public class RealSubject implements Subject {
	@Override
	public String hello() {
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		return "hello";
	}
}

静态代理类

public class ProxySubject implements Subject {
	private Subject subject;

	public ProxySubject(Subject subject) {
		this.subject = subject;
	}

	@Override
	public String hello() {
		System.out.println(subject.hello());
		return "hello2";
	}
}

静态代理工厂

public class ProxyFactory {
	public static Subject getInstance(){
		return new ProxySubject(new RealSubject());
	}
}

测试一下

public class ProxyTest {
	@Test
	public void test() {
		Subject subject = ProxyFactory.getInstance();
		System.out.println(subject.hello());
	}
}

执行结果

hello
hello2

静态代理类优缺点

优点:
业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。
缺点:
代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任了。 
如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。