文档章节

浅谈proxy代理模式

青衣霓裳
 青衣霓裳
发布于 09/18 12:48
字数 1280
阅读 17
收藏 0

一、前言

代理是代替服务器去接受请求者的请求的中间人。我们也听说过代理服务器,它的作用的帮助客户端去请求客户端想要的资源,为什么要通过代理呢,那是因为客户端直接访问服务器会被拒绝(防火墙屏蔽),而代理服务器则可以直接访问服务器,客户端通过代理服务器,将请求的结果交给代理服务器,代理服务器对这些内容进行重组换成自己的标识(IP),并且将请求的结果返回给用户,这样做的弊端就是访问的速度大打折扣,但是总比没有强。

我们的代理模式就是这么干的,如果代理能够处理的东西(比如用户已经访问过的,服务器返回过来的没有过期的缓存),不用请求服务器了,直接返回给用户,而只有代理服务器不能处理的东西才会再次交给服务器去处理,当然这只是代理的一种策略,为了能够加快访问速度,这样代理服务器就代替我们去访问服务器了。

二、代码实例

本人去处理所有事情是非常麻烦的,特别是初始化的时候都非常的耗时,因此使用代理,不到必须自己出马的时候一直按兵不动,让代理去完成这些工作,这就是代理模式。

Printable接口:代理的同源性:

package designMode.proxy;

public interface Printable {
    public abstract void setPrinterName(String name);
    public abstract String getPirnterName();
    public abstract void print(String word);
}

Printer类:本人(相当于真正的服务器)

package designMode.proxy;

public class Printer implements Printable{
    String name;

    public Printer(String name) {
        this.name = name;
        heavyWork();
        System.out.println("生成打印机实例成功...");
    }

    private void heavyWork(){
        System.out.println("本人:"+name);
        try {
            Thread.sleep(5000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }

    @Override
    public void setPrinterName(String name) {
        this.name=name;
    }

    @Override
    public String getPirnterName() {
        return name;
    }

    @Override
    public void print(String word){
        System.out.println("打印机"+name+"正在打印...");
        System.out.println(word);
        System.out.println("打印完成!");
    }
}

ProxyPrinter代理类:

package designMode.proxy;

public class ProxyPrinter implements Printable {
    String name;
    Printer printer = null;

    //代理能做的事情自己去做
    @Override
    public void setPrinterName(String name) {
        if(printer!=null){
            printer.setPrinterName(name);
        }
        this.name = name;
    }

    //代理能做的事情自己去做
    @Override
    public String getPirnterName() {
        return name;
    }

    //代理做不了的事情交给真正能做的(打印机)去做
    @Override
    public void print(String word) {
        check();
        printer.print(word);
    }

    private synchronized void check(){
        if(printer==null){
            printer = new Printer(name);
        }
    }
}

Main类:

package designMode.proxy;

public class Main {
    public static void main(String[] args) {
        Printable proxy = new ProxyPrinter();
        proxy.setPrinterName("江疏影");
        System.out.println("此时代理的名字为:"+proxy.getPirnterName());
        System.out.println("==遇到了代理处理不了的工作,通知服务器==");
        proxy.print("hello,world!");
        System.out.println("======================");
        proxy.setPrinterName("倪妮");
        System.out.println("此时代理的名字为:"+proxy.getPirnterName());
        proxy.print("hello,my country!");
    }
}

启动服务器很耗时(这里用睡眠5秒表示),那么使用代理服务器可以轻松处理一些事务(设置名字,获取名字),知道代理服务器无能为力的时候(print打印内容),代理服务器就会通知服务器去处理,从本例来看,因为使用了委托机制,将printer对象组合进来,但是printer是不知道代理的,它只是被启动了而已,这说明了什么?本人(printer)可以不做任何改动,就可以增加很多的代理去启动本人,这样非常有利于扩展,其实这里也使用了懒加载机制,看到只有到不得不使用的时候才生成被代理的实例,那么可不可以直接在代理模式中使用懒加载机制呢,答案是不利于扩展性,没有这种分而治之的思想好,这样的好处是很大的,在main中可以随意切换,同时能够定义相同的必须的接口。这种透明性是非常有益的,在很多模式中都有体现。

三、总结

代理模式是一种常见的模式,只在必须的时候生成实例,也分为很多种类,主要按照使用去分类的,比如本例的虚拟代理,以及其它的远程代理,访问控制代理等,我们主要理解代理的实现本质,代理的意义,以及手机用途。代理模式与装饰器模式比较类似,都是持有了同类或父类的引用(委托机制),并且在函数之中调用了同类的方法来加工与同类同名的本类的响应方法,但是也有区别,代理模式是为了减轻被代理人的工作,在不得已的时候再去打扰被代理人,而装饰器模式是为了产生新的功能,装饰原有的属性。

© 著作权归作者所有

青衣霓裳
粉丝 96
博文 81
码字总数 175767
作品 0
大连
私信 提问
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
Java单例设计模式的理解与常规实现方式

1:Java中单例模式是一种常见的设计模式,单例模式有以下特点:   单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 2:java中单例模式的写法也有很多种,我在这...

动力节点
01/02
0
0
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu
2017/11/02
0
0
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
2018/11/06
185
0
浅谈Java设计模式之——抽象工厂模式

版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/azhon/article/details/90614321 上一篇文章我们介绍了一下,这一节就接着...

Code-Porter
05/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

数据库物理设计要做什么

选择合适的数据管理系统。 注意: 1、事务多时选Oracle。 2、SQLserver只支持在Windows下运行。 3、开发用的语言用的.net时,使用SQL server。 2、MySQL常用存储引擎 MySQL是开源数据库,只要...

sunnycat-薛定谔的猫
12分钟前
2
0
如何快速安全的插入千万条数据

前言 最近有个需求解析一个订单文件,并且说明文件可达到千万条数据,每条数据大概在20个字段左右,每个字段使用逗号分隔,需要尽量在半小时内入库。 思路 1.估算文件大小 因为告诉文件有千万...

ksfzhaohui
14分钟前
3
0
Could not build the precompiled application for the device.

Flutter报错:Could not build the precompiled application for the device. Xcode报错:Multiple commands produce '/Users/User/Library/Developer/Xcode/DerivedData/Runner-faibejedzvv......

RainOrz
24分钟前
3
0
UCOSII 任务调度笔记

ucosii是根据优先级进行调度的。对于任务,两种状态,就绪态和非就绪态,很多种情况下任务都会处于非就绪态,如:信号量,消息队列,邮箱,延迟,任务的挂起,调度锁等都会使程序进入非就绪态...

青春无极限
27分钟前
3
0
JS-4-if

本文转载于:专业的前端网站➼JS-4-if 流程控制结构 1 顺序结构 alert(10); alert(20); 2 分支结构(选择结构) * IF 2.1 if(条件) { 条件成立时执行的语句 } else { 条件不成立时执行的语句 ...

前端老手
28分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部