Proxy模式——静态代理

作者: 吃啥呀 | 来源:发表于2018-07-16 16:57 被阅读120次

java设计模式


Proxy : 代理人——代替别人工作的人
“本人”寻找“代理人”工作,但是代理人毕竟是代理人,能代替本人所做的事有限,当代理人无法帮忙时再寻找本人

RealSubject:真实角色,是实现抽象接口的类。
Proxy:代理角色,内部含有对真实对象RealSubject的引用,从而可以操作真实对象。代理对象提供与真实对象相同的接口,以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
Subject : 接口,是对象和它的代理共用的接口,让RealSubject和Proxy具有一致性。

Proxy.png

1.抽象接口

public interface Subject {
    void setNumber(int number);//代理人可以帮忙做的事
    int getNumber();//代理人可以帮忙做的事
    void displayNumber();//只有本人才能做的事
}

2.真实类

public class RealSubject implements Subject {

    private int number;

    public RealSubject(){
        System.out.println("正在生成本人实例");
    }//非参构造函数

    public RealSubject(int number){
        this.number = number;
        System.out.println("正在生成本人实例");
    }//构造函数

    @Override
    public void setNumber(int number) {
        this.number = number;
    }

    @Override
    public int getNumber() {
        return number;
    }

    @Override
    public void displayNumber() {
        System.out.println("只有本人才能做的事 :");
        System.out.println(number);
    }//只有本人才能做的事
}

3.代理类

public class Proxy implements Subject {
    private RealSubject realSubject;//本人。代理人持有本人的引用,当代理人无法完成要求时,再生成本人
    private int number;

    public Proxy(int number){
        this.number = number;
    }

    @Override
    public void setNumber(int number) {
        if(realSubject != null){
            //当本人不是null,则说明以及生成了本人的实例化对象,这时就可以直接让本人操作了
            realSubject.setNumber(number);
        }
        this.number = number;
    }

    @Override
    public int getNumber() {
        return number;
    }

    @Override
    public void displayNumber() {
        //这件事只用又本人来做,所以要生成“本人”
        realize();
        realSubject.displayNumber();

    }
    private void realize(){
        if(realSubject == null){
            realSubject = new RealSubject();
        }
    }
}

4.测试

public class Main {

    public static void main(String[] args) {

        Subject subject = new Proxy(5);
        System.out.println("现在的数字是 :" + subject.getNumber());//获得数字代理即可完成
        subject.setNumber(12);//设置数字,代理也可以完成
        System.out.println("设置后的数字是 :" + subject.getNumber());//获得数字代理即可完成
        System.out.println("打印出数字(只能由本人完成)");
        subject.displayNumber();
    }
}

5.运行结果

main.png

优点

使用Proxy角色,使得耗时处理(生成实例)推迟。
在大型系统的初始化过程中,存在大量耗时处理,如果初始化暂时不会使用的功能,会使启动时间延长,所以使用代理模式,先初始化需要使用的功能

代理与委托

当遇到代理人不会解决的问题时,还是会“转交”给本人——“委托”(现实世界中是本人委托给代理人,在设计模式中却相反)

HTTP代理

Web浏览器访问Web页面,不会每次都访问远程Web服务器来获取页面内容,而是先获取HTTP代理缓存的页面。只有当需要新的页面或者是页面缓存过期才去访问远程Web服务器
Web服务器:Client角色,HTTP代理:Proxy角色,Web服务器:RealSubject角色

完整代码在仓库:https://github.com/chenshuyuhhh/ProxyPattern.git

相关文章

  • Java 代理

    静态代理 动态代理 JDK 提供的Proxy CGLib cglib | GitHub 参考文章 Java的三种代理模式

  • Proxy模式——静态代理

    java设计模式 Proxy : 代理人——代替别人工作的人“本人”寻找“代理人”工作,但是代理人毕竟是代理人,能...

  • 行为型-代理(Proxy)

    代理(Proxy) [TOC] 定义 代理模式主要的实现分为两种,一类是静态代理,一类是动态代理,无论是静态还是动...

  • 设计模式之代理模式

    代理模式 静态代理 动态代理 由上图代码可看到,proxy逻辑被抽象到ProxyHandler中,与业务完全解耦,...

  • Java静态代理和动态代理

    Java静态代理: 其实就是设计模式中的一种; 如下图所示: 静态代理的缺点: Proxy类其实没有实际的内容,它...

  • Java代理

    前言 Java代理大致可以分为静态代理(static proxy),动态代理(dynamic proxy)。所谓代...

  • 六大原则 动态代理

    参考 六大原则 代理模式 介绍了三种代理:静态代理、Proxy、cglib java 动态代理详解介绍了动态代理具...

  • nginx七层代理

    nginx:静态代理请求: nginx_http_proxy_module:代理模块; proxy_pass :代...

  • 大连滕泰科技学习笔记2020-05-07

    1,静态代理模式 2,动态代理(实现方式JDK自带的Proxy代理类) 2,1 代理对象2,2 要代理的目标对象2...

  • 面试常问的设计模式之代理模式的详细解析

    Proxy-代理模式 代理模式 代理模式: Proxy Pattern. 指为对象提供一种代理,用以控制对这个对象...

网友评论

    本文标题:Proxy模式——静态代理

    本文链接:https://www.haomeiwen.com/subject/xxjbpftx.html