代理模式:
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,
而代理对象可以在客户端和目标对象之间起到中介的作用。
比如:代理服务器、产品代理、工商代理、会计代理、房地产中介、职业中介等。
组成:
抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
这里是一个代理服务器的实现代理模式example code:
抽象角色:
/**
* 服务器
* Created by jiangzhq on 2015/6/23.
*/
public interface Server {
public void service();
}
真实角色:提供真实的服务
/**
* 外网服务器,提供访问境外服务
* Created by jiangzhq on 2015/6/23.
*/
public class InternetServer implements Server{
public void service() {
System.out.println("外网服务器,提供访问境外服务");
}
}
代理角色:代替真实角色执行动作,需要注入真实角色,有多种方法注入:构造函数、set方法等
/**
* 代理服务器,除提供境外网站服务,还需要突破GFW封锁
* Created by jiangzhq on 2015/6/23.
*/
public class ProxyServer implements Server {
InternetServer server;
// 注入真实角色
public ProxyServer() {
server = new InternetServer();
}
public void service() {
before();
server.service();
after();
}
public void before(){
System.out.println("突破GFW封锁");
}
public void after(){
System.out.println("使用代理服务器可以访问境外服务,是明智的选择");
}
}
/**
* 客户端测试类
* Created by jiangzhq on 2015/6/23.
*/
public class ProxyTest {
public static void main(String[] args) {
Server proxyServer = new ProxyServer();
proxyServer.service();
}
}
代理模式的设计,是使用抽象类或接口作为“抽象角色”,每个“代理角色”代理一个“真实角色”。
使用代理模式,可以在不改变原有类的基础上,增加额外的功能,代码做到了无污染,低耦合,符合开闭原则。
本文的这种代码实现方式,是静态代理模式,虽然对原来代码无污染,但如果被代理的类数目多,会需要写很多的代理类代码,势必造成系统臃肿,使用动态代理可以解决这个问题,且看下一文 代理模式之动态代理 。