轻松学会代理模式

栏目: 后端 · 发布时间: 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 去购买


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

查看所有标签

猜你喜欢:

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

The Art of Computer Programming, Volumes 1-3 Boxed Set

The Art of Computer Programming, Volumes 1-3 Boxed Set

Donald E. Knuth / Addison-Wesley Professional / 1998-10-15 / USD 199.99

This multivolume work is widely recognized as the definitive description of classical computer science. The first three volumes have for decades been an invaluable resource in programming theory and p......一起来看看 《The Art of Computer Programming, Volumes 1-3 Boxed Set》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

在线进制转换器
在线进制转换器

各进制数互转换器

随机密码生成器
随机密码生成器

多种字符组合密码