TWT Studio - Android 组培训 & 技术分享

Proxy模式——静态代理

2018-07-16  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读