代理模式之静态代理

代理模式:

为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,

而代理对象可以在客户端和目标对象之间起到中介的作用。

比如:代理服务器、产品代理、工商代理、会计代理、房地产中介、职业中介等。

组成:

抽象角色:通过接口或抽象类声明真实角色实现的业务方法。

代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。

真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。

这里是一个代理服务器的实现代理模式example code:

扫描二维码关注公众号,回复: 238439 查看本文章

抽象角色:

/**
 * 服务器
 * 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();
    }
}

代理模式的设计,是使用抽象类或接口作为“抽象角色”,每个“代理角色”代理一个“真实角色”。

使用代理模式,可以在不改变原有类的基础上,增加额外的功能,代码做到了无污染,低耦合,符合开闭原则。

本文的这种代码实现方式,是静态代理模式,虽然对原来代码无污染,但如果被代理的类数目多,会需要写很多的代理类代码,势必造成系统臃肿,使用动态代理可以解决这个问题,且看下一文 代理模式之动态代理 。

猜你喜欢

转载自geeksun.iteye.com/blog/2222806