Java设计模式之代理模式

代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式:   人如其名,代理相信大家都可以经常看到什么什么代理,现实中代理太多了。感受最真实的是火车票的代理,经常可以在街上看到,你买票的是在代理商买的,但是付的钱依然会交给铁大哥,这就是代理。现实中的你可能会接触的例子就是叫同学去给你买票,实际上不是你去买,但是是票是你的。这也是代理。
代理模式组成:   抽象角色:通过接口或抽象类声明真实角色实现的业务方法。   代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。   真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
代理的UML图
  《Java设计模式之代理模式》
代理的优点:   (1).职责清晰 真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。叫你去买票,我管你有没有摔跤撒的,不需要关注这种问题。   (2).代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。别人在路上一看,以为是你同学要买票去哪里,实际上买的是你的,保护了你。   (3).高扩展性 只要符合火车站规定的人,同学都可以去代人买票。 下面就用代码来实现着一个过程。

 1 package com.roc.prory;
 2 
 3 /**
 4  * 定义一个种类的人 抽象角色
 5  * 
 6  * @author liaowp
 7  * 
 8  */
 9 public interface Person {
10 
11     /**
12      * 可以去火车站买票
13      */
14     public void buyTicket();
15 
16 }
package com.roc.prory;
/**
 * 小王 代理角色
 * @author liaowp
 *
 */
public class XiaoWang implements Person {
    
    private Person  person = null;//默认就是一个人
    
    public XiaoWang(){//小王比较聪明,知道带别人买票赚钱。默认是只赚小明的钱
        this.person = new XiaoMing();
    }
    
    public XiaoWang(Person per){//赚小明的不够,只要是人就赚。
        this.person = per;
    }
    
    /**
     * 小王也是人,也可以去买票。
     */
    public void buyTicket() {//调不然方法去买票,代理商
        this.person.buyTicket();
    }

}
package com.roc.prory;

/**
 * 小明 真实角色
 * @author liaowp
 *
 */
public class XiaoMing implements Person {

    //比较懒
    
    /* 
     * 小明也是人,也可以去买票。
     * @see com.roc.prory.Person#buyTicket()
     */
    @Override
    public void buyTicket() {
        System.out.println("买小明的票");
    }

}
package com.roc.prory;
/**
 * 小丽
 * @author liaowp
 *
 */
public class XiaoLi implements Person {

    /**
     * 小丽也可以自己买票。
     */
    public void buyTicket() {
        System.out.println("买小丽的票");
    }

}
package com.roc.prory;
/**
 * 测试代理模式
 * @author liaowp
 *
 */
public class Client {
    public static void main(String[] args) {
        XiaoWang xiaoWang = new XiaoWang();//new 的小王
        xiaoWang.buyTicket();//小王去买了小明的票,这就是代理
        
        XiaoLi xiaoLi = new XiaoLi();//买票也要有这个人呀。先把小丽 new 出来。
        XiaoWang mrWang = new XiaoWang(xiaoLi);//小丽说:小王帮我去买个票呗
        mrWang.buyTicket();//屁颠屁颠的跑去买了
    }
}

 

    原文作者:鹏&鹏
    原文地址: https://www.cnblogs.com/liaoweipeng/p/5342214.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞