首页 > 其他分享 >代理模式(Proxy)

代理模式(Proxy)

时间:2022-11-24 22:13:05浏览次数:64  
标签:Star 对象 void 代理 模式 Proxy println public

代理模式指的是:为某个对象提供一个代理对象,并且由代理对象控制对原对象的访问。

 

使用场景:

1、安全代理:屏蔽对真实角色的直接访问。

2、远程代理:通过代理类处理远程方法调用(RMI)。

3、延迟加载:先加载轻量级的代理对象,真正需要再加载真实对象。


 

分类:

1、静态代理:静态定义代理类。

  例子:静态代理设计模式

2、动态代理:动态生成代理类。

   实现方式:

  •   JDK自带的动态代理
  •   javassist字节码操作库实现
  •   CGLIB
  •   ASM

 

使用JDK自带的动态代理,实现:

  1、创建一个处理器,处理器继承 java.lang.reflect 包下的InvocationHandler 接口,组合真实对象,重写  invoke  方法,在invoke方法中实现对真实对象的控制访问。

  2、在需要代理角色的时候,通过java.lang.reflect.Proxy 类的静态方法    newProxyInstance(类加载器,处理器的构造器参数,处理器)获取一个代理对象。

 

例子:

Star  接口:

/**
 * 歌星
 */
public interface Star {
    void eat();//吃饭
    void sing();//唱歌
    void sleep();//睡觉
}

RealStar 真实对象:

/**
 * 歌星:佩奇
 */
public class RealStar implements Star{
    @Override
    public void eat() { System.out.println("佩奇吃饭饭"); }

    @Override
    public void sing() { System.out.println("我是一只佩奇~  我不会唱歌~"); }

    @Override
    public void sleep() { System.out.println("佩奇睡觉觉"); }
}

StarHandler  歌星处理器:实现 InvocationHandler 接口,组合 Star 类,重写 inboke 类。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
 * 处理器
 */
public class StarHandler implements InvocationHandler {
    private Star star;//需要代理的对象

    public StarHandler(Star star) { this.star = star; }
/** * * @param o 代理对象 * @param method 获取的对象的方法 * @param objects 方法的参数 * @return * @throws Throwable */ @Override public Object invoke(Object o, Method method, Object[] objects) throws Throwable { System.out.println("---------------invoke方法开始"); //调用的是吃饭,代理对象来处理 if(method.getName().equals("eat")){ System.out.println(o.getClass().getSimpleName()+":吃饭我来就行了"); } //如果是唱歌,那就让真正的歌星去唱歌。 if(method.getName().equals("sing")){ method.invoke(star,objects); } //调用的是睡觉,代理对象来处理 if(method.getName().equals("sleep")){ System.out.println(o.getClass().getSimpleName()+":吃饭我来就行了"); } System.out.println("---------------invoke方法结束"); return null; } }

客户测试一下:

import java.lang.reflect.Proxy;

public class Client {
    public static void main(String[] args) {
        //创建真实对象
        Star peiqi = new RealStar();
        //获取处理器
        StarHandler starHandler = new StarHandler(peiqi);
        //获取代理类对象:通过Proxy获取,需要指定类加载器、构造器参数、处理器。
        Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),
                new Class[]{Star.class},
                starHandler);
        //代理角色吃饭干活
        proxy.eat();
        proxy.sing();
        proxy.sleep();
    }
}

运行结果:

 

 

 

  

标签:Star,对象,void,代理,模式,Proxy,println,public
From: https://www.cnblogs.com/lurenjia-bky/p/16923595.html

相关文章

  • 代理池、bs4解析、re解析
    requests更多用法ssl认证1.https和httphttps=http+ssl/tsl(认证证书)2.使用2.1不认证证书importrequests#不验证证书,报警告,返回200res=requests.get('https......
  • 桥接模式javac++
    [实验任务一]:两个维度的桥接模式用桥接模式实现在路上开车这个问题,其中,车可以是car或bus,路可以是水泥路或沥青路。     packagetest9;publicclassBusi......
  • 组合模式java+c++
    [实验任务一]:组合模式用透明组合模式实现教材中的“文件夹浏览”这个例子。    packagetest10;publicabstractclassAbstractFile{publicabstrac......
  • 装饰模式java+c++
    [实验任务一]:手机功能的升级用装饰模式模拟手机功能的升级过程:简单的手机(SimplePhone)在接收来电时,会发出声音提醒主人;而JarPhone除了声音还能振动;更高级的手机(ComplexP......
  • 适配器模式c++
    [实验任务一]:双向适配器实现一个双向适配器,使得猫可以学狗叫,狗可以学猫抓老鼠。  #include<iostream>usingnamespacestd;classCat{public:virtualvoid......
  • Java 设计模式:工厂模式
    目录工厂模式(FactoryPattern)实现简单工厂模式示例工厂方法模式示例抽象工厂模式示例参考工厂模式(FactoryPattern)所属:创建型模式,适用时机:我们明确地计划不同条件下创建......
  • 注解与代理模式
    注解与代理模式相关介绍Annotation就是嵌入在代码中的标记,补充代码功能,可以修饰包,类,方法,变量实际开发中,基于注解可以替换配置文件框架=注解+反射+设计模式的集合......
  • Glob模式匹配
    前言在本文中我将以glob是什么,glob的语法,glob与正则表达式的差异等几个方面对glob模式匹配进行一个梳理,希望也能对读者起到一定的帮助。glob是什么glob是用于文件名的......
  • Spring Boot 整合 RabbitMQ 之 Fanout Exchange模式 (三)
    摘要:那前面已经介绍过了Direct模式(一)Topic转发模式(二),这次介绍下FanoutExchange形式又叫广播形式,因此我们发送到路由器的消息会使得绑定到该路由器的每一个Queue接收......
  • Spring Boot 整合 RabbitMQ 之 Topic转发模式 (二)
    摘要:上一篇介绍了Direct模式的消息发生机制,这篇介绍下Topic转发模式的消息发生机制。一:首先我们看发送端,我们需要配置队列Queue,再配置交换机(Exchange),再把队列按照相应......