设计模式之-代理模式,快速掌握理解代理模式,以及代理模式的使用场景

系列文章目录

设计模式之-6大设计原则简单易懂的理解以及它们的适用场景和代码示列
设计模式之-单列设计模式,5种单例设计模式使用场景以及它们的优缺点
设计模式之-3种常见的工厂模式简单工厂模式、工厂方法模式和抽象工厂模式,每一种模式的概念、使用场景和优缺点。
设计模式之模板方法模式,通俗易懂快速理解,以及模板方法模式的使用场景
设计模式之-建造者模式通俗易懂理解,以及建造者模式的使用场景和示列代码
设计模式之-代理模式,快速掌握理解代理模式,以及代理模式的使用场景
设计模式之-原型模式,快速掌握原型模式,通俗易懂的理解原型模式以及使用场景
设计模式之-中介者模式,快速掌握中介者模式,通俗易懂的讲解中介者模式以及它的使用场景
设计模式之-责任链模式,快速掌握责任链模式,通俗易懂的讲解责任链模式以及它的使用场景
设计模式之-装饰模式,快速掌握装饰模式,通俗易懂的讲解装饰模式以及它的使用场景


文章目录

  • 系列文章目录
  • 一、什么是代理模式?
  • 二、代理模式的主要使用场景
  • 三、通俗易懂的代码示例


一、什么是代理模式?

代理模式是一种结构型设计模式,它允许通过创建一个代理对象来控制对另一个对象的访问。代理对象充当客户端与目标对象之间的中介,可以在不改变目标对象的情况下,增加额外的功能或提供额外的控制。

在现实生活中,代理模式的例子可以是一位明星的经纪人。明星(目标对象)负责演艺工作,而经纪人(代理对象)负责处理合同、安排日程、接待粉丝等工作。经纪人在不改变明星的情况下,为明星提供额外的服务和保护。

二、代理模式的主要使用场景

  1. 远程代理:当对象位于不同的地址空间中时,可以通过远程代理来访问对象。远程代理可以隐藏对象的具体实现细节,并提供网络通信的功能。
  2. 虚拟代理:当对象的创建和初始化过程比较耗时时,可以使用虚拟代理来延迟对象的创建。虚拟代理会在需要时才创建实际的对象,并在创建完成后将请求转发给实际对象。
  3. 安全代理:当需要对对象的访问进行控制时,可以使用安全代理。安全代理会在客户端访问目标对象之前进行权限验证,确保只有具有相应权限的客户端才能访问目标对象。

三、通俗易懂的代码示例

下面是一个通俗易懂的代理模式示例代码,以电影票购买为场景:

// 抽象主题:电影票
interface MovieTicket {
    void buy();
}

// 真实主题:电影票实际对象
class RealMovieTicket implements MovieTicket {
    private String movieName;

    public RealMovieTicket(String movieName) {
        this.movieName = movieName;
        loadMovie();
    }

    private void loadMovie() {
        System.out.println("正在加载电影《" + movieName + "》...");
    }

    @Override
    public void buy() {
        System.out.println("购买了电影票《" + movieName + "》");
    }
}

// 代理主题:电影票代理
class ProxyMovieTicket implements MovieTicket {
    private RealMovieTicket realMovieTicket;
    private int discount;

    public ProxyMovieTicket(String movieName, int discount) {
        this.realMovieTicket = new RealMovieTicket(movieName);
        this.discount = discount;
    }

    @Override
    public void buy() {
        float price = 100.0f * discount / 100.0f;
        System.out.println("使用代理购买电影票,实际票价:" + price + " 元");
        realMovieTicket.buy();
    }
}

// 客户端代码
public class Main {
    public static void main(String[] args) {
        // 直接购买电影票
        MovieTicket movieTicket = new RealMovieTicket("复仇者联盟");
        movieTicket.buy();

        // 通过代理购买电影票
        MovieTicket proxyTicket = new ProxyMovieTicket("复仇者联盟", 80);
        proxyTicket.buy();
    }
}

在上面的示例中,MovieTicket是抽象主题接口,定义了购买电影票的方法buy。RealMovieTicket是真实主题类,实现了抽象主题接口,并在构造函数中加载电影。ProxyMovieTicket是代理主题类,也实现了抽象主题接口。它包含一个真实主题对象,并在购买电影票时提供额外的服务(折扣)。

在客户端代码中,首先直接购买了电影票,然后通过代理购买了电影票。代理对象在购买电影票前提供了额外的服务(折扣),然后将购买请求转发给真实主题对象。

通过使用代理模式,可以在不改变真实主题对象的情况下,给对象增加额外的功能或提供额外的控制。代理模式可以提供更灵活的访问控制,并且可以隐藏真实主题对象的具体实现细节。

你可能感兴趣的:(设计模式学习,设计模式,代理模式)