首页 > 其他分享 >代理模式

代理模式

时间:2024-03-18 19:00:13浏览次数:23  
标签:角色 void Object 代理 模式 proxy public

代理模式主要分为两种。

  1. 静态代理

  2. 动态代理

学习Spring的AOP之前,需要了解代理模式。

基于租房这一事件,抽象角色与行为。

房东、房屋中介、租客

房东和房屋中介的共同行为:出租房屋。
image

静态代理举例一

静态代理角色分析(括号内是本次举例中的角色)

  • 抽象角色:一般使用接口或者抽象类来实现。(出租房屋接口)

  • 真实角色: 被代理的角色。(房东)

  • 代理角色:代理真实角色。代理真实角色后,会做一些附属的操作。(中介)

  • 客户:使用代理角色来进行一些操作。(租客)

编写接口Rent

//房东和中介的共同行为,抽象成接口或抽象类
public interface Rent {
    void rent();//出租房屋
}

编写房东Host

public class Host implements Rent {//我是房东
    @Override
    public void rent() {
        System.out.println("房东出租房屋");
    }
}

编写房屋中介,也就是所谓的代理Proxy

public class Proxy implements Rent {//我是房屋中介
    private Host host;

    public Proxy() {
    }

    //我可以作为房东的代理,直面租客 出租房屋
    public Proxy(Host host) {
        this.host = host;
    }

    public void rent() {//中介还有其他附属操作。
        look();
        host.rent();//出租的房屋实际上是房东的
        hetong();
    }

    public void look(){
        System.out.println("看房");
    }

    public void hetong(){
        System.out.println("签合同");
    }

}

编写租客,也就是客户端Client

public class Client {//我是租客
    public static void main(String[] args) {
        Host host = new Host();//现有一个房东想出租房屋。
        Proxy proxy = new Proxy(host);//房屋中介,代理了这个房东

        proxy.rent();//租客成功租房,房屋出租
    }
}

输出结果

看房
房东出租房屋
签合同

分析

  1. 在这个过程中,租客直接接触的就是中介。

  2. 就如同现实生活中的样子,租客看不到房东。

  3. 但是租客依旧通过代理租到了房东的房子。

  4. 这就是所谓的代理模式。

静态代理举例二

  1. 编写抽象角色,增删改查用户接口
public interface UserService {
   void add();
   void delete();
   void update();
   void query();
}
  1. 编写真实角色,增删改查用户实现类
public class UserServiceImpl implements UserService {

   public void add() {
       System.out.println("增加了一个用户");
  }

   public void delete() {
       System.out.println("删除了一个用户");
  }
   //...省略改查
}
  1. 编写代理角色,实现用户的增删改查前,调用日志。
public class UserServiceProxy implements UserService {
   private UserServiceImpl userService;

   public void setUserService(UserServiceImpl userService) {
       this.userService = userService;
  }

   public void add() {
       log("add");
       userService.add();
  }

   public void delete() {
       log("delete");
       userService.delete();
  }
   //...省略改查
   public void log(String msg){
       System.out.println("执行了"+msg+"方法");
  }

}
  1. 编写测试
public class Test  {
   public static void main(String[] args) {
       //真实对象
       UserServiceImpl userService = new UserServiceImpl();
       //代理对象
       UserServiceProxy proxy = new UserServiceProxy();
       //代理类实现日志功能
       proxy.setUserService(userService);
       proxy.add();
  }
}
/*
执行了add方法
增加了一个用户
*/

静态代理的优点

  • 可以使真实角色更加纯粹。(房东)

  • 公共的业务由代理来完成,实现了业务的分工。

  • 公共业务发生扩展时变得更加集中和方便。
    image

静态代理的缺点

  • 每个代理类之间不可复用,工作量变大,开发效率降低。

动态代理

想要静态代理的好处,又不想要静态代理的缺点。所以。就有了动态代理。

需要两个类:

  1. InvocationHandler接口

  2. Proxy类

Proxy

使用Proxy类的静态方法,可以返回创建一个代理类(代理角色)的实例。

public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces,
                                          InvocationHandler h)
  • loader:代理角色的类加载器(代理类.class.getClassLoader())

  • interfaces:抽象角色(抽象角色.class)

  • h:调用处理程序(每个代理类的实例都有一个关联的调用处理程序,可以理解为无情的方法执行者)

InvocationHandler

接口功能唯一,调用代理实例的方法并返回结果。

public Object invoke(Object proxy, Method method, Object[] args)

proxy:代理实例(

标签:角色,void,Object,代理,模式,proxy,public
From: https://www.cnblogs.com/rowbed/p/18081198

相关文章

  • Web 开发模式演进过程
    作为初学者,要了解Web开发模式的演进过程,并从这些演进过程中看到变化,这样有利于开发者的思路提升。什么是Web开发Web:网页,可以通过浏览器访问的资源Web开发:基于网页载体的软件开发,以网页提供给用户进行业务功能操作Web应用:由多个静态和动态web资源组成,如:HTML、CS、......
  • gRPC的四种通信模式
    目录gRPC的四种通信模式一、RPC(UnaryRPC)二、服务端流RPC三、客户端流RPC四、双向流RPC五、综合案例5.1新建streamdemo.proto5.2执行命令,生成go文件5.3客户端5.4服务端六、总结gRPC的四种通信模式gRPC有四种通信⽅式,分别是:简单RPC(UnaryRPC)、服务端流式RPC(Serverstrea......
  • nginx location 和proxy_pass 代理说明
    在nginx中配置proxy_pass的时候,当proxy_pass的最后位置带了/和不带/有很大的区别。当proxy_pass后面的url不带/的时候,相当于直接代理到后端的proxy_pass地址当proxy_pass后面的url带/的时候,相当于代理导当前域名+location路径+后面的访问地址当你使用proxy_pass指令时,如果......
  • 【IT老齐045】RabbitMQ六种队列模式
    【IT老齐045】RabbitMQ六种队列模式前情提要Producer:生产者,消息的提供者Consumer:消费者,消息的使用者Broker:MQ服务器,管理队列、消息及相关信息Message:消息,程序间的通信的数据Queue:队列,消息存放的容器,消息先进先出Exchange:交换机,用于分发消息工作模式简单模式工作队列......
  • HDFS 安全模式
    HDFS安全模式安全模式概述:安全模式是HDFS所处的一种特殊状态,在这种状态下,文件系统只接受读数据请求,而不接受删除、修改等变更请求,是一种保护机制,用于保证集群中的数据块的安全性。在NameNode主节点启动时,HDFS首先进入安全模式,集群会开始检查数据块的完整性。DataNode在启动的......
  • 广州腾讯云代理商:电脑怎么在腾讯云服务器上安装软件
    目录广州腾讯云代理商:电脑怎么在腾讯云服务器上安装软件如何在腾讯云服务器上安装软件腾讯云的优势在腾讯云服务器上安装软件的步骤案例演示总结广州腾讯云代理商:电脑怎么在腾讯云服务器上安装软件简介:飞机@luotuoemo本文由(阿里云国际站代理商:【聚搜云】www.4526.......
  • nginx 正向代理
    环境规划序号IP地址操作系统用途1192.168.174.126(外网)192.168.80.128(内网)ubuntu23.10代理服务器2192.168.80.129(内网)ubuntu23.10Linux客户端软件版本nginx:1.24.0代理模块:proxy_connect_rewrite_102101.patch安装nginx#......
  • nginx 反向代理注意
    1.Nginx中正则捕获组在proxy_pass中不可用有一个需求,根据不同的路径代理到后端问题出在$1这个正则捕获组上。在Nginx中,正则表达式中的捕获组是根据()定义的,但这个捕获组只在location内部有效,并且不会传递到proxy_pass中。所以当你在proxy_pass中使用$1时,它实......
  • mysql安全模式下创建账号
    1.首先停止mysql数据库服务2.进入mysql数据库的bin目录下,打开cmd,以--skip-grant-tables模式登录数据库,执行如下指令3.安全模式启动MYSQL数据库服务后,在MYSQL数据库的bin目录下打开第二个cmd4.以root账号登录mysql数据库:mysql-uroot5.查看数据库,执行SHOWDATABASES;6.......
  • 来自通义千问的观察者模式的实现
    Spring相关的实现BusinessProcessEvent.javapackagecom.example.demo.event;importorg.springframework.context.ApplicationEvent;publicclassBusinessProcessEventextendsApplicationEvent{privateStringinstanceId;privateStringoperationType;......