设计模式之代理模式

代理模式

  核心作用:通过代理,控制访问对象的访问。

  可以详细控制访问某个(某类)对象的方法,在调用这个前做什么处理,在调用这个方法后做什么处理。(即AOP(面向切面的微观实现))

  核心角色

  • 抽象角色:定义代理角色和真实角色的公共对外方法;
  • 真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用;
  • 代理角色:实现抽象角色,是真实角色代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。

  

举个例子

    我们要租房,首先我们会找到中介,中介会带你看房,看好之后和你签订合同,最后交房租,后期房屋有什么问题,直接找中介处理;但是中介只会服务你到签合同,你交房租以及处理房屋问题的时候是和真实房东打交道。

    这里:真实的房东就是真实角色;中介就是代理角色;我们抽象出一个出租者就是抽象角色。

    

/**
 * Lender 房屋出租者
 * @author yangkj*/
public interface Lender {
    /**
     * 看房
     */
    void checkRoom();
    /**
     * 签合同
     */
    void singContract();
    /**
     * 收房租
     */
    void collectMoney();
    /**
     * 修理
     */
    void repari();

}
/**
 * Agent 房屋中介
 * @author yangkj
 * @version
 * @since 2016年9月5日
 */
public class Agent implements Lender {

    private Landlord landlord;

    public Agent(Landlord landlord) {
        super();
        this.landlord = landlord;
    }

    @Override
    public void checkRoom() {
        System.out.println("中介带着看房");
    }

    @Override
    public void singContract() {
        System.out.println("中介和你签合同");
    }

    @Override
    public void collectMoney() {
        landlord.collectMoney();
    }

    @Override
    public void repari() {
        landlord.repari();
    }
}
/**
 * Landlord 真实的房东
 * @author yangkj*/
public class Landlord implements Lender{

    @Override
    public void checkRoom() {
        System.out.println("看房子");
    }

    @Override
    public void singContract() {
        System.out.println("签合同"); 
    }

    @Override
    public void collectMoney() {
        System.out.println("房东收房租");
    }

    @Override
    public void repari() {
        System.out.println("房屋有什么问题,房东来维修");
    }
}
/**
 * Client 客户端
 * @author yangkj*/
public class Client {

    public static void main(String[] args) {
        Landlord landlord = new Landlord();
        
        Agent agent = new Agent(landlord);
        
        agent.checkRoom();
        agent.singContract();
        agent.collectMoney();
        agent.repari();
    }
}

什么时候使用代理模式?

  • 安全代理:屏蔽对真实角色的访问;
  • 远程代理:通过代理类处理远程方法调用;
  • 延迟加载:先加载轻量级的代理对象,真正需要的时候再加载真实的对象。(比如图片的预览,先加载缩略图,用户点击需要的图片时,再加载真实的大图)

      

posted @ 2016-09-05 10:54  星星满天  阅读(358)  评论(0编辑  收藏  举报