轻松学会代理模式

栏目: 后端 · 发布时间: 5年前

内容简介:在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。意图:为其他对象提供一种代理以控制对这个对象的访问。

代理模式

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的 设计模式 属于结构型模式。

在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

介绍

意图:为其他对象提供一种代理以控制对这个对象的访问。

主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。

何时使用:想在访问一个类时做一些控制。

如何解决:增加中间层。

关键代码:实现与被代理类组合。

应用实例:

  • Windows 里面的快捷方式。
  • 买火车票不一定在火车站买,也可以去代售点。 4、一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。 5、spring aop。

优点: 1、职责清晰。 2、高扩展性。 3、智能化。

缺点: 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

使用场景:按职责来划分,通常有以下使用场景: 1、远程代理。 2、虚拟代理。 3、Copy-on-Write 代理。 4、保护(Protect or Access)代理。 5、Cache代理。 6、防火墙(Firewall)代理。 7、同步化(Synchronization)代理。 8、智能引用(Smart Reference)代理。

注意事项: 1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。 2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。

猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类

以游戏买票为例:

创建一个接口 Ticket

public interface Ticket {

    void goToMap();

}

创建一个代理类,实现 该接口 ProxyTicket

public class ProxyTicket implements Ticket {

    private RealTicket realTicket;
    private String ticketName;

    public ProxyTicket(String ticketName) {
        this.ticketName = ticketName;
    }

    @Override
    public void goToMap() {
        System.out.println("开始进入地下城...");
        if(realTicket == null){
            realTicket = new RealTicket(ticketName);
        }
        realTicket.goToMap();
    }
}

创建一个具体类实现该接口 RealTicket

public class RealTicket implements Ticket{

    private String ticketName;

    public RealTicket(String ticketName) {
        this.ticketName = ticketName;
        buyTicket(ticketName);
    }

    @Override
    public void goToMap() {
        System.out.println("当前玩家拥有通行证,进入地下城...");
    }

    private void buyTicket(String ticketName){
        System.out.println("当前玩家没有通行证,RealTicket开始购买" + ticketName);
    }


}

创建 MapDemo 测试:

public class MapDemo {

    public static void main(String[] args) {

        Ticket ticket = new ProxyTicket("深渊通行证");
        ticket.goToMap();
        System.out.println("再次挑战");
        ticket.goToMap();


    }

}

测试结果:

开始进入地下城...
当前玩家没有通行证,RealTicket开始购买深渊通行证
当前玩家拥有通行证,进入地下城...
再次挑战
开始进入地下城...
当前玩家拥有通行证,进入地下城...

当玩家进入地图时会判断是否拥有通行证,没有则使用代理类 RealTicket 去购买


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序员之禅

程序员之禅

[德] Christian Grobmeier / 荣耀、朱艳 / 人民邮电出版社 / 2015-8 / 39.00元

禅是一种生活态度和生活方式。程序员是一份特别辛苦的职业,也是一个承受各种压力的群体。在物欲横流的今天,禅对于程序员有着特殊的意义和价值。 本书的作者是一名德国程序员老兵,深谙程序员的喜怒哀乐。他曾经发表了一篇题为“程序员之禅的十条法则”的博客文章,引发众多程序员热烈的讨论和强烈的共鸣。本书共10章,结合程序员日常生活和工作的方方面面,作者通过对禅的知识、理解、体验、思考和感悟,提出很多中肯的......一起来看看 《程序员之禅》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

SHA 加密
SHA 加密

SHA 加密工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具