大话设计模式读书笔记系列-4.代理模式

>>>大话设计模式读书笔记系列目录>>>

代理模式

为其他对象提供一种代理以控制这个对象的访问.

场景:

通过"屌丝男士"委托"金牌代理"给校花"杨幂"送礼物的场景来了解代理模式

被追求者(校花)
/**
 * 被追求者(校花)
 */
public class SchoolGirl {
    /**
     * 芳名
     */
    private String name;

   public SchoolGirl(String name)
   {
       this.name=name;
   }

    /**
     * 获取 芳名
     *
     * @return name 芳名
     */
    public String getName() {
        return this.name;
    }

    /**
     * 设置 芳名
     *
     * @param name 芳名
     */
    public void setName(String name) {
        this.name = name;
    }
}

 

送礼物接口
/**
 * 送礼物接口
 */
public interface GiveGift {
    /**
     * 送洋娃娃
     */
    void giveDolls();
    /**
     * 送花
     */
    void giveFlowers();
    /**
     * 送巧克力
     */
    void giveChocolate();
}

 

追求者类
/**
 * 追求者类
 */
public class Pursuit implements GiveGift {

    /**
     * 名字
     */
    private String name;
    /**
     * 心仪的校花MM
     */
    SchoolGirl schoolGirl;

    public Pursuit(String name) {
        this.name = name;
    }

    /**
     * 喜欢上一个MM
     *
     * @param schoolGirl
     */
    public void like(SchoolGirl schoolGirl) {
        this.schoolGirl = schoolGirl;
    }

    @Override
    public void giveDolls() {

        if (this.schoolGirl == null) {
            return;
        }
        System.out.println(this.name + " 送洋娃娃给 " + this.schoolGirl.getName());
    }

    @Override
    public void giveFlowers() {
        if (this.schoolGirl == null) {
            return;
        }
        System.out.println(this.name + " 送鲜花给 " + this.schoolGirl.getName());
    }

    @Override
    public void giveChocolate() {
        if (this.schoolGirl == null) {
            return;
        }
        System.out.println(this.name + " 送巧克力给 " + this.schoolGirl.getName());
    }
}

 

职业代理人
/**
 * 职业代理人
 */
public class ProxyMan implements GiveGift {

    /**
     * 委托人
     */
    private Pursuit pursuit;

    /**
     * 构造代理人
     * @param pursuit
     * @param schoolGirl
     */
    public ProxyMan(Pursuit pursuit, SchoolGirl schoolGirl) {
        //委托人
        this.pursuit = pursuit;
        //心仪女神
        this.pursuit.like(schoolGirl);
    }

    @Override
    public void giveDolls() {
        this.pursuit.giveDolls();
    }

    @Override
    public void giveFlowers() {
        this.pursuit.giveFlowers();
    }

    @Override
    public void giveChocolate() {
        this.pursuit.giveChocolate();
    }
}

 

调用

public class ProxyDemo {

    public static void main(String[] args) {
        //校花杨幂
        SchoolGirl schoolGirl=new SchoolGirl("杨幂");
        //委托人
        Pursuit pursuit=new Pursuit("屌丝男士");
        //金牌代理人,接受 屌丝男士 追求 杨幂 任务
        ProxyMan proxyMan=new ProxyMan(pursuit,schoolGirl);
        //洋娃娃腐化
        proxyMan.giveDolls();
        //鲜花腐化
        proxyMan.giveFlowers();
        //巧克力腐化
        proxyMan.giveChocolate();
    }

}

 

结果

屌丝男士 送洋娃娃给 杨幂
屌丝男士 送鲜花给 杨幂
屌丝男士 送巧克力给 杨幂

 

解析

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

2.虚拟代理,是根据需要创建开销很大的对象,通过他来存放实例化需要很长时间的真实对象.

3.安全代理,用来控制真实对象访问时的权限.

4.智能指引,是指当调用真实的对象时,代理处理另外一些事.

 

 

posted @ 2019-08-07 11:39  疯癫大圣  阅读(204)  评论(0编辑  收藏  举报