首页 > 代码库 > 代理模式

代理模式

代理模式:为其他对象提供一种代理以控制对这个对象的访问。当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,所访问的真实对象与代理对象需要实现相同的接口。

技术分享

Subject:抽象主题类,声明真实主题与代理的共同接口方法。 
RealSubject:真实主题类,定义了代理所表示的真实对象,客户端通过代理类间接的调用真实主题类的方法。 
Proxy:代理类,持有对真实主题类的引用,在其所实现的接口方法中调用真实主题类中相应的接口方法执行。 
Client:客户端类。

故事背景:小王和小黄是同学,隔壁班小明喜欢小王,就托好朋友小黄帮忙送花,买早餐,送礼物。

1> 首先创建小明和小黄共同接口

package agenttest;

/**
 *
 * @author 阿正
 */
public interface IFavorite {
    void flower();
    void breakfast();
    void gift();
}

2> 创建XiaoMing类,实现接口方法

package agenttest;

/**
 *
 * @author 阿正
 */
public class XiaoMing implements IFavorite{

    @Override
    public void flower() {
        System.out.println("flower");
    }

    @Override
    public void breakfast() {
        System.out.println("breakfast");
    }

    @Override
    public void gift() {
        System.out.println("gift");
    }
    
}

3> 创建XiaoHuang类,实现接口方法,但具体调用的是小明的方法

package agenttest;

/**
 *
 * @author 阿正
 */
public class XiaoHuang implements IFavorite{
    public XiaoMing xiaoming;

    public XiaoHuang(XiaoMing xiaoming) {
        this.xiaoming = xiaoming;
    }
    
     @Override
    public void flower() {
        xiaoming.flower();
    }

    @Override
    public void breakfast() {
        xiaoming.breakfast();
    }

    @Override
    public void gift() {
        xiaoming.gift();
    }
}

4>客户端

package agenttest;

/**
 *
 * @author 阿正
 */
public class AgentTest {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        XiaoMing xiaoming = new XiaoMing();
        XiaoHuang xiaohuang = new XiaoHuang(xiaoming);
        xiaohuang.flower();
        xiaohuang.breakfast();
        xiaohuang.gift();
    }
    
}

代理模式的应用:

代理可分为静态代理和动态代理。

1> 远程代理:为一个对象的不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。

2> 虚拟代理:根据需要创建开销很大的对象。通过它存放实例化需要很长时间的真实对象。

3> 安全代理:用来控制真实对象访问时的权限。

代理模式