代理模式

代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.

代理模式在现实生活中的例子非常常见。

我们很多人都追星,喜欢送礼物给明星,但是实际上我们送出去的礼物大多数不是直接送到明星手里的,而是通过他们的经纪人。

这里的经纪人就是典型的代理对象。

下面通过一个粉丝送礼物的例子来说明一下代理模式。

首先是粉丝类,粉丝这个类里面定义了一个方法,sendGift。

package com.proxy;

public class Fans {

    public String sendGift(String gift){
        System.out.println("send " + gift  +" to my idol!");
        return gift;
    }
    
}

然后定义一个接受礼物的接口

package com.proxy;

public interface AcceptGift {
    
    /**
     * 接受礼物
     * @param gift
     */
    public void accept(String gift);  
    
}

之后定义明星类,明星类实现AcceptGift的接口,可以接受礼物。

package com.proxy;

public class Idol implements AcceptGift{

    @Override
    public void accept(String gift) {
        // TODO Auto-generated method stub
        System.out.println("Idol say : I accept " + gift);
    }

}

最后定义经纪人类,同样实现AcceptGift的接口,可以接受礼物。

package com.proxy;

public class Agent implements AcceptGift{
    
    Idol idol;
    
    public Agent() {
        // TODO Auto-generated constructor stub
        idol = new Idol();
    }

    @Override
    public void accept(String gift) {
        // TODO Auto-generated method stub
        if(gift.equals("danger")){ //检查礼物是否安全
            System.out.println("Agent say : gift is danger!");
        }
        else{
            idol.accept(gift);
        }
    }
    
}

在这个代理类里面,经纪人首先会检查礼物是否安全,如果礼物不安全,会发出警告,不会将礼物转交给明星,

如果礼物是安全的,则转交给明星。

现在可以测试一下

package com.test;

import com.proxy.Agent;
import com.proxy.Fans;

public class Test {
    public static void main(String[] args){
        Fans fans0 = new Fans();
        String gift0 = fans0.sendGift("flower"); //粉丝0送花
        
        Fans fans1 = new Fans();
        String gift1 = fans1.sendGift("danger"); //粉丝1送危险物品
        
        System.out.println();
        
        Agent agent = new Agent();
        agent.accept(gift0); //经纪人接受礼物转送给明星
        
        agent.accept(gift1); //经纪人接受礼物转送给明星
            
    }

}

输出结果如下:

通过代理类,粉丝将礼物送到了明星手里,同时经纪人对礼物的检查也避免了一些不安全的事件(这也是代理模式的应用场景之一——安全代理)。

代理模式的应用场景主要有:

1、远程代理  这个就比如粉丝在A地遇到经纪人,将礼物给了经纪人,经纪人将礼物快递到B地的明星

2、虚拟代理:根据需要创建开销很大的对象,通过它来实例化需要很长时间的真实对象。

这个好比粉丝见面会,明星耍大牌,姗姗来迟。

经纪人这个时候就需要一面安抚粉丝,告诉粉丝:“xxx马上来了,稍安勿躁”,一面安排车辆接明星,并催明星:“xxx,快过来,不然你就掉粉了!”

3、安全代理

4、智能代理:是指调用真实对象时,代理处理另外一些事。

这个好比,经纪人转发礼物给明星的时候,顺便告诉他,送这个礼物的粉丝是某某某权贵的女儿,好好处理关系。

看多了八卦还是有用的啊= =

原文地址:https://www.cnblogs.com/cuglkb/p/7018963.html