虚拟代理模式-Virtual Proxy(Java实现)

虚拟代理模式-Virtual Proxy

虚拟代理模式(Virtual PRoxy)会推迟真正所需对象实例化时间. 在需要真正的对象工作之前, 如果代理对象能够处理, 那么暂时不需要真正对象来出手.

优点: 这种方法的优点是,在应用程序启动时,由于不需要创建和装载所有的对象,因此加速了应用程序的启动。

缺点: 因为不能保证特定的应用程序对象被创建,在访问这个对象的任何地方,都需要检测确认它不是空(null)。性能的降低上不仅仅是多了一句代码这么简单, ` if ` 这种跳转类语句的很有可能会阻塞CPU的指令流水, 虽然有分值预测技术, 但是分支预测也是有命中率的....

还是回过头讲讲本文的主题吧....

举个例子: 有一批人来找老板谈事情, 谈事情之前需要预约, 将这些预约添加到计划列表里. "将预约添加到计划列表里"这件事, 本身并不需要老板亲自现身, 老板不再的时候完全可以找一个助手来代做, 只有执行任务计划列表里的任务时, 老板才需现身处理(场景就是: 大家都是来找老板做事的, 并不是来找助手做事的, 助手只负责在老板不在的时候帮老板收集大家的需求, 最后收集完了, 他就把老板邀请过来, 老板来处理所有的事情).

Approvable接口

老板和助手都需要实现这个接口.

助手实现这个接口, 当调用助手的approve方法时, 助手就会去邀请老板过来, 让老板处理清单.

老板实现这个接口, 是因为这些清单就需要老板来处理(approve)

public interface Approvable {
    void approve() ;
}

Boss类

老板是有身价的, 来一趟不容易, 所以小事交给助手做(就比如: 收集访客们找老板有什么事情, 并统计出一个清单). 没必要一上来就把老板叫出来.

import java.util.LinkedList;
import java.util.List;

public class Boss implements Approvable {
    List<String> orders;

    {
        System.out.println("\nBoss出现...\n");

    }

    public Boss() {
        this.orders = new LinkedList<>();
    }

    public Boss(List<String> orders) {
        if (orders != null) {
            this.orders = orders;
        } else {
            this.orders = new LinkedList<>();
        }
    }

    public void addOrder(String order) {
        this.orders.add(order);
    }

    @Override
    public void approve() {
        while(orders.size()>0){
            String order = orders.remove(0);
            System.out.println("Boss处理了任务<" + order + ">");
        }
        System.out.println();
    }
}

Assistant类

Boss的代理类, 老板的助手.

import java.util.LinkedList;
import java.util.List;

/**
 * Boss的代理
 * 负责收集orders列表, 处理清单之前的收集工作就不用老板现身了,
 * 老板可以晚一点出现
 */
public class Assistant implements Approvable {
    List<String> orders;
    volatile Boss boss;

    public Assistant() {
        orders = new LinkedList<>();
    }

    public void addOrder(String order) {
        if (boss != null) {
            System.out.println("Boss亲自将<" + order + ">任务添加到列表");
            boss.addOrder(order);
        } else {
            System.out.println("助手将<" + order + ">任务添加到列表");
            this.orders.add(order);
        }
    }

    @Override
    public void approve() {
        inviteBoss();
        boss.approve();
    }

    private void inviteBoss() {
        if (boss == null) {
            synchronized (this) {
                if (boss == null) {
                    boss = new Boss(orders);
                }
            }
        }
    }
}

Main

用于运行, 场景模拟

public class Main {
    public static void main(String[] args) {
        // 有很多人来找老板, 老板在忙, 助手先把所有事情安置好
        Assistant assistant = new Assistant();
        assistant.addOrder("我找Boss面试");
        assistant.addOrder("我找Boss借钱");
        assistant.addOrder("我找Boss聊天");

        // 收集好了, 助手的职责就完成了, 把Boss叫出来, 让Boss处理. 或者说approve这件事,助手是做不了的, 只能叫出Boss来做.
        assistant.approve();

        // Boss刚才就被邀请过来, 现在就在现场. 所以就不需要助手转告给Boss了. 大家告诉助手的事情, Boss也会听到
        assistant.addOrder("我找Boss吃饭");
        assistant.addOrder("我找Boss喝酒");
        assistant.approve();
    }
}

原文地址:https://www.cnblogs.com/noKing/p/9062329.html

时间: 2024-10-07 18:40:21

虚拟代理模式-Virtual Proxy(Java实现)的相关文章

代理模式-JDK Proxy(Java实现)

代理模式-JDK Proxy 使用JDK支持的代理模式, 动态代理 场景如下: 本文例子代理了ArrayList, 在ArrayList每次操作时, 在操作之前和之后都进行一些额外的操作. ArrayListProxy类 这里是代理的实现. import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class ArrayListProxy implements InvocationHan

保护代理模式-Access Proxy(Java实现)

保护代理模式-Access Proxy 保护代理模式(Access Proxy), 也叫Protect Proxy. 这种代理用于对真实对象的功能做一些访问限制, 在代理层做身份验证. 通过了验证, 才调用真实的主体对象的相应方法. 模拟场景如下: 某平台的系统有查询功能, 可以根据关键词进行查询, 在查询之前对该关键词进行检查, 如果关键词是敏感词, 那么就不予处理. 如果成功查询了该关键词, 那么就记录一条日志. (敏感词验证同理也可以换成 `用户的身份验证` 之类的其他的验证) Searc

java设计模式(10):代理模式(Proxy)

一,定义:  代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问. 二,其类图: 三,分类一:静态代理 1,介绍:也就是需要我们为目标对象编写一个代理对象,在编译期就生成了这个代理对象,然后通过访问这个代理,来实现目标对象某些功能. 2,简单应用:在这里我们看一个简单的登录登出的例子: 登录功能的接口: [java] view plaincopyprint? /** * 公共接口,目标对象和代理都来实现 */ public interface ILogin{ //登录 void

【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理

这篇博文,我们主要以类图和代码的形式来对照学习一下静态代理和动态代理.重点解析各自的优缺点. 定义 代理模式(Proxy Pattern)是对象的结构型模式,代理模式给某一个对象提供了一个代理对象,并由代理对象控制对原对象的引用. 代理模式不会改变原来的接口和行为,仅仅是转由代理干某件事,代理能够控制原来的目标,比如:代理商,代理商仅仅会买东西,但并不会改变行为.不会制造东西. 让我们通过以下的代码好好理解一下这句话. 分类 静态代理和动态代理 静态代理 静态代理类图 代码演示样例 接口 pac

java设计模式学习 ----- 代理模式(Proxy)

代理模式(Proxy) 其实每个模式名称就表明了该模式的作用,代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思.再如我们有的时候打官司,我们需要请律师,因为律师在法律方面有专长,可以替我们进行操作,表达我们的想法.先来看看关系图: 根据上文的阐述,代理模式就比较容易的理解了,我们看下代码: public interface Sourceable { publ

NET设计模式 第二部分 结构性模式(13):代理模式(Proxy Pattern)

代理模式(Proxy Pattern) ——.NET设计模式系列之十四 Terrylee,2006年5月 摘要:在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对象,如果直接访问会给系统带来不必要的复杂性,这时候可以在客户程序和目标对象之间增加一层中间层,让代理对象来代替目标对象打点一切.这就是本文要说的Proxy模式. 主要内容 1.例说Proxy模式 2.Proxy模式效果及实现要点 …… 概述 在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而

.NET设计模式(14):代理模式(Proxy Pattern)(转)

摘要:在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对象,如果直接访问会给系统带来不必要的复杂性,这时候可以在客户程序和目标对象之间增加一层中间层,让代理对象来代替目标对象打点一切.这就是本文要说的Proxy模式. 主要内容 1.例说Proxy模式 2.Proxy模式效果及实现要点 …… 概述 在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对象,如果直接访问会给系统带来不必要的复杂性,这时候可以在客户程序和目标对象之

第12章 代理模式(Proxy Pattern)

原文   第12章 代理模式(Proxy Pattern) 代理模式 概述: 在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对象,如果直接访问会给系统带来不必要的复杂性,这时候可以在客户程序和目标对象之间增加一层中间层,让代理对象来代替目标对象打点一切.这就是本文要说的Proxy模式. 结构图:     举例:       代练游戏,玩游戏,自己不想花时间去升级.委托给代练. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1

6,代理模式(Proxy Pattern)就是为其他对象提供一种代理以控制对这个对象的访问。 比如: 智能指针 为别人做嫁衣

所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代理与被代理的目标类交互,而代理一般在交互的过程中(交互前后),进行某些特别的处理. 概述 作为C++工程师,免不了要管理内存,内存管理也是C++中的难点,而智能指针采用引用计数的办法很方便的帮我们管理了内存的使用,极大方便了我们的工作效率.而智能指针的这种用法其实就是代理模式的一种,他帮我们控制了该对象的内存使用. 代理模式就是为其他对象提供一种代理来控制对这个对象的访问. subject(抽象主题角色):真实主题与代