• 代理模式


    代理(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、智能代理:是指调用真实对象时,代理处理另外一些事。

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

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

  • 相关阅读:
    abp vnext v2.9.0 Blogging模块安装遇到的问题及解决方法
    TestCafe前端E2E自动化测试技术要点(转)
    UI自动化测试框架 ---TestCafe(转)
    一条龙(1)
    Nginx常用命令
    如何下载各大视频网站的视频,从html5中video标签截取blob视频流(纯使用Downie下载工具非代码操作)
    beego连接Mysql,生成WebAPI+CRUD和Swagger
    Go每日一题(7)
    Go每日一题(6)
    Go每日一题(5)
  • 原文地址:https://www.cnblogs.com/cuglkb/p/7018963.html
Copyright © 2020-2023  润新知