代理模式(Proxy)

代理(Proxy)模式是一种比较有用的模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构。我们也许有代理服务器等概念,代理概念可以解释为:在出发点到目的地之间有一道中间层,意为代理。

 

《设计模式》中定义:为其他对象提供一种代理以控制对这个对象的访问。

 

代理模式的实例:

 

新建一个买车的接口:

public interface Buy_car_package {
    public void buy_car();
}

 

新建一个People人类,具有买车的行为,所以实现接口Buy_car_package:
public class People implements Buy_car_package {

    private int cash;
    private String username;

    public int getCash() {
        return cash;
    }

    public void setCash(int cash) {
        this.cash = cash;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
    public void buy_car() {
        System.out.println(username + "买了一台新车");
    }
}

 

People类不能拥有车,必须经过proxy代理类的认证,符合条件之后才可以拥有车辆,新建一个代理,这个代理类来考察当前的People是否有资格进行买车:
public class Proxy_buy_car_imple implements Buy_car_package {

    private People people;

    public People getPeople() {
        return people;
    }

    public void setPeople(People people) {
        this.people = people;
    }

    public void Buy_car() {
        if (people.getCash() > 3000) {
            System.out.println(people.getUsername() + "花" + people.getCash()
                    + "块钱,买了新车,交易结束");
        } else {
            System.out.println(people.getUsername() + "金钱不够,请继续筹集经费!");
        }
    }

}

 

好了,代理模式平台搭建好后,我们就使用这个代理来模拟买车的行为:
public class Run_main {
    public static void main(String[] args) {
        People people_ref1 = new People();
        people_ref1.setCash(4000);
        people_ref1.setUsername("陈云松");

        People people_ref2 = new People();
        people_ref2.setCash(2000);
        people_ref2.setUsername("松云陈");

        Proxy_buy_car_imple proxy_buy_car_imple = new Proxy_buy_car_imple();
        proxy_buy_car_imple.setPeople(people_ref1);
        proxy_buy_car_imple.buy_car();

        proxy_buy_car_imple.setPeople(people_ref2);
        proxy_buy_car_imple.buy_car();

    }
}


程序运行结果如下:
陈云松花4000块 买了新车 交易结束
松云陈金钱不够,请继续筹集经费!

 

这样不是所有的People能够自由的拥有车辆,必须经过proxy的认证之后才可以。

 

而代理模式在GOF四人帮的介绍中大体有4种使用情景:

 

(1)远程代理。典型的就是客户端与webservice使用的情况,客户端由于是针对OOP编程,而不是针对webservice中的方法进行编程,所以得在客户端模拟一下webservice的环境,用proxy来对webservice进行包装,这样就可以使用proxy代理类来远程操作webservice了。

 

(2)虚拟代理。比如你要开发一个大文档查看软件,大文档中有大的图片,有可能一个图片有100MB,在打开文件时不可能将所有的图片都显示出来,这样就可以使用代理模式,当需要查看图片时,用proxy来进行大图片的打开。

 

(3)安全代理。其实也就是本例中所举的买车的例子,金钱不够不可以买车!

 

(4)智能指引。比如在访问一个对象时检测其是否被锁定等情况。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值