笨蛋学设计模式结构型模式-代理模式【8】

发布时间:2024年01月15日

7.2代理模式??????

7.2.1概念

? 代理模式通过引入一个新的代理对象来控制对原始对象的访问。而代理对象充当了调用者与真实对象之间的中介,调用者通过代理对象来访问真实对象。代理模式可以在不修改原有目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。

7.2.2场景

? 在我们去某个地方旅游时,我们可以报名旅行社,通过旅行社来给我们安排行程、酒店、机票等等一些服务,旅行社就是我们去旅游时的代理对象,他们代表我们与航空公司、酒店、旅游景点等去进行交涉和预订,为我们提供我们在某个地方时的各种旅游服务。

7.2.3优势 / 劣势

  • 增强安全性:隐藏被代理对象的复杂性,隐藏其详细信息,使得调用者不需要与被代理对象进行交互
  • 提高扩展性:在不修改被代理对象的前提下,提供额外的功能操作,扩展被代理对象的功能

  • 增加系统复杂性:实现代理模式需要额外的工作/代码,有些代理模式的实现过程较为复杂
  • 降低系统性能:增加一个代理对象会导致请求处理速度变慢,因为代理对象需要进行额外的操作

7.2.4代理模式可分为

  • 抽象主题Subject:抽象类,通过接口或抽象类声明真实主题和代理对象实现的业务方法
  • 真实主题RealSubject:定义了Proxy所代表的真实对象,是客户端最终要访问的对象
  • 代理Proxy:包含一个引用,该引用可以是RealSubject的实例,控制对RealSubject的访问,并可能负责创建和删除RealSubject的实例

7.2.5代理模式

package com.technologystatck.designpattern.mode.proxy;

public class Proxy {
    public static void main(String[] args) {
        ProxyClass proxyClass = new ProxyClass();
        proxyClass.request();
    }
}

//1.定义抽象主题,声明真实主题和代理对象实现的业务方法
interface Subject{
    void request();
}

//2.定义真实主题,实现抽象主题中的具体业务
class RealSubject implements Subject{

    @Override
    public void request() {
        System.out.println("RealSubject handles the request.");
    }
}

//3.定义代理类,包含对RealSubject的引用,并提供和真实主题相同的接口,
//然后该代理就可以替代真实主题,对真实主题进行功能扩展
class ProxyClass implements Subject{

    private RealSubject realSubject;
    @Override
    public void request() {
        //在访问真实主题之前可以添加额外的逻辑
        if(realSubject == null){
            realSubject = new RealSubject();
        }
        //调用真实主题的方法
        realSubject.request();

        //在访问真实主题之后可以添加额外的逻辑
    }
}

7.2.6实战

7.2.6.1题目描述

小明想要购买一套房子,他决定寻求一家房屋中介来帮助他找到一个面积超过100平方米的房子,只有符合条件的房子才会被传递给小明查看。

7.2.6.2输入描述

第一行是一个整数 N(1 ≤ N ≤ 100),表示可供查看的房子的数量。

接下来的 N 行,每行包含一个整数,表示对应房子的房屋面积。

7.2.6.3输出描述

对于每个房子,输出一行,表示是否符合购房条件。如果房屋面积超过100平方米,输出 “YES”;否则输出 “NO”。

7.2.6.4代码
package com.technologystatck.designpattern.mode.proxy;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int nums = scanner.nextInt();
        scanner.nextLine();

        IntermediaryProxy intermediaryProxy = new IntermediaryProxy();
        for(int i=0;i<nums;i++){
            int houseArea = scanner.nextInt();
            //直接放入中介代理类去判断是否符合想要的房子面积
            intermediaryProxy.requestPurchase(houseArea);
        }
    }
}


//抽象主题,抽象一个买房子方法
interface HomePurchase{
    void requestPurchase(int area);
}

//真实主题,相当于买家直接购买房子
class HomeBuyer implements HomePurchase{

    @Override
    public void requestPurchase(int area) {
        System.out.println("YES");
    }
}

//代理类,相当于中介
class IntermediaryProxy implements HomePurchase{
    //实例化买家
    private HomeBuyer homeBuyer= new HomeBuyer();

    @Override
    public void requestPurchase(int area) {
        if(area > 100){
            homeBuyer.requestPurchase(area);
        }else{
            System.out.println("NO");
        }
    }
}

7.2.7总结

  • 代理模式

  • 优点:可以在调用目标对象之前或之后添加额外的操作;还可以通过代理访问远程对象,实现了客户端和远程对象间的解耦

  • 总结:当代理模式涉及到多个对象间的交互,会增加系统的复杂性,但同时也可以额外扩展对象的功能

  • 场景

    • 虚拟代理:当一个对象的创建和初始化比较昂贵时,使用虚拟代理来延迟对象的实际创建和初始化,只在需要时才真正创建并初始化对象
    • 安全代理:可以根据访问者的权限决定是否允许访问真实对象的方法
文章来源:https://blog.csdn.net/YSL_Monet/article/details/135574778
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。