设计模式——代理模式

一、什么是代理模式:

## 代理模式就是为其他对象提供一种代理来控制对这个对象的访问的适用场合的模式 ##

二、代理模式的模型:

这里写图片描述

/**
 * 真实请求类和代理类的公共接口
 */
public interface Subject {

    public void request();

}


/**
 * 真实请求类,实现真实请求类与代理类的公共接口
 */
public class RealSubject implements Subject {

    @Override
    public void request() {
        System.out.println("真实的请求");
    }

}

/**
 * 代理类,拥有一个真实请求类的实例
 */
public class Proxy implements Subject {
    RealSubject realSubject; // 真实请求类的对象

    @Override
    public void request() {
        if (realSubject == null)
            realSubject = new RealSubject();
        realSubject.request(); // 调用真实类的的真实请求方法以达到代理的效果
    }

}

/**
 * 客户端类,用于测试
 */
public class Client {

    public static void main(String[] args) {
        Proxy proxy = new Proxy();
        proxy.request();
    }

}

三、 一个关于代理模式的例子(参考大话设计模式)

(1)问题背景:
该实例是代理模式的一个简单例子:
模拟的是一个男生要追一个女生,然后男生不直接给女生送花(暂叫男1和女1),而是通过另外叫一个男生(男2)帮他送花的模式
在这里,男1相当于真实真实请求类,男2相当与代理类

(2)代码:

/**
 * 女生类, 追求者所追求的女生类
 */
public class Girl {

    private String name;// 被追求者名字

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

/**
 * 真实请求类和代理类的公共接口,定义了几个行为
 */
public interface Subject {

    /**
     * 送花
     */
    public void sendFlowers();

    /**
     * 送巧克力
     */
    public void sendChocolate();

    /**
     * 送玩具
     */
    public void sendDolls();
}

/**
 * 追求者类, 相当于真实请求类,实现公共接口
 */
public class Pursuit implements Subject {

    Girl girl; // 追求者所追求的女生对象

    public Pursuit(Girl girl) {
        this.girl = girl;
    }

    @Override
    public void sendFlowers() {
        System.out.println(girl.getName() + ",送花给你");
    }

    @Override
    public void sendChocolate() {
        System.out.println(girl.getName() + ",送巧克力给你");
    }

    @Override
    public void sendDolls() {
        System.out.println(girl.getName() + ", 送玩具给你");
    }

}

/**
 * 代理类,拥有一个追求者实例,同时实现公共借口
 */
public class Proxy implements Subject {
    private Pursuit pursuit;

    public Proxy(Pursuit pursuit) {
        this.pursuit = pursuit;
    }

    @Override
    public void sendFlowers() {
        pursuit.sendFlowers();
    }

    @Override
    public void sendChocolate() {
        pursuit.sendChocolate();
    }

    @Override
    public void sendDolls() {
        pursuit.sendDolls();
    }

}

/**
 * 客户端类,用于测试
 */
public class Client {

    public static void main(String[] args) {
        Girl girl = new Girl("被追求的女生");
        Pursuit pursuit = new Pursuit(girl);
        Proxy  proxy = new Proxy(pursuit);

        proxy.sendChocolate();
        proxy.sendDolls();
        proxy.sendFlowers();
    }

}

四、代理模式使用场合(出自DP):

##(1) 远程代理:为一个对象在不同的地址空间提供局部的代表##
##(2) 虚拟代理:根据需要创建按开销很大的对象。通过代理来存放实例化需要很长时间的真实对象(可以用于优化下载)##
##(3) 安全代理:用来控制真实对象访问的权限##
##(4) 智能指引:当调用真实的对象时,代理处理例外的一些事情##

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值