首页 > 其他分享 >01-设计模式-代理模式

01-设计模式-代理模式

时间:2023-07-15 10:22:08浏览次数:31  
标签:01 Subject 代理 doSth RealSubject 设计模式 public subject

1、代理模式的分类

代理模式分为:

静态代理:在编译阶段确定了被代理对象的类型,简单。
动态代理:在运行阶段确定了被代理对象的类型,复杂。

2、静态代理

静态代理涉及的类:

  1. 一个接口,下面的例子中命名为Subject
  2. 实现了接口的 被代理对象RealSubject
  3. 实现了接口的 代理对象StaticProxy

1、接口Subject-代码实现:

public interface Subject{
    void doSth();
}

2、被代理对象RealSubject-代码实现:

public class RealSubject implements Subject{
    @Override
    public void doSth(){
         System.out.println("\t\t被代理的对象执行 doSth() 方法");
    }
}

3、代理对象StaticProxy-代码实现:

public class StaticProxy implements Subject{
    private Subject subject;
    
    public StaticProxy(Subject subject) {
        this.subject = subject;
    }
    
    @Override
    public void doSth(){
        System.out.println("静态代理-前置方法...");
        subject.doSth();
        System.out.println("静态代理-后置方法...");
    }
}

4、使用:

public class Main {
    public static void main(String[] args) {
        /*
           静态代理:
             - 在编译时就确定了代理关系。
             - 代理类和被代理类实现共同的接口,
               被代理类作为代理类的成员变量,
               在代理类的重写的方法里调用被代理类的方法。
         */        
        RealSubject subject = new RealSubject();
        StaticProxy proxy = new StaticProxy(subject);
        proxy.doSth();
    }
}

/* 
打印结果:

        静态代理-前置方法...
                被代理的对象执行 doSth() 方法
        静态代理-后置方法...
        
*/

3、动态代理

动态代理涉及的类:

  1. 一个接口,下面的例子中命名为Subject
  2. 实现了接口的 被代理对象RealSubject
  3. 实现了接口的 代理对象DynamicProxyHandler

1、接口Subject-代码实现:

public interface Subject{
    void doSth();
}

2、被代理对象RealSubject-代码实现:

public class RealSubject implements Subject{
    @Override
    public void doSth(){
         System.out.println("\t\t被代理的对象执行 doSth() 方法");
    }
}

3、代理对象DynamicProxy-代码实现:

class DynamicProxyHandler implements InvocationHandler{
    
    private Subject subject;
    
    public DynamicProxyHandler(Subject subject) {
        this.subject = subject;
    }
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		
        System.out.println("动态代理-前置方法...");
        Object rst = method.invoke(target, args);
        System.out.println("动态代理-后置方法...");

        return rst;
    }
    
}

4、使用:

import java.lang.reflect.Proxy;

public class Main {
    public static void main(String[] args) {
        /*
            动态代理:
                - 在运行阶段确定调用关系,此处使用JDK的动态代理,jdk动态代理必须实现接口才能完成
                - 被代理类实现自定义接口,
                  被代理类作为代理处理器类的成员变量,
                  代理处理器类实现 InvocationHandler 接口,实现invoke方法,
                  invoke方法中执行 method.invoke(被代理类, args) 并返回代理对象
        */  
        
        Subject subject = new RealSubject();
        
        DynamicProxyHandler handler = new DynamicProxyHandler(subject);
        
        Subject proxy = (Subject)Proxy.newInstance(
        	subject.class.getClassLoader(),
            subject.class.getInterfaces(),
            handler
        );
        
        proxy.doSth();
                  
	}
}

/*
打印结果:

    动态代理-前置方法...
            被代理的对象调用 doSth() 方法
    动态代理-后置方法...
    
*/

标签:01,Subject,代理,doSth,RealSubject,设计模式,public,subject
From: https://www.cnblogs.com/cywdder/p/17555692.html

相关文章

  • [NOI2018] 屠龙勇士
    题意求解下列同余方程组,\[\begin{cases}b_1x\equiva_1\pmod{m_1}\\b_2x\equiva_2\pmod{m_2}\\\dots\\b_nx\equiva_n\pmod{m_n}\\\end{cases}\]其中,\(n\leqslant10^5,m_i\leqslant10^8,lcm(m_i)\leqslant10^{12},a_i\leqslant......
  • 【雕爷学编程】Arduino动手做(162)---OPT101模拟光照传感器模块3
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是......
  • 【雕爷学编程】Arduino动手做(162)---OPT101模拟光照传感器模块2
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • [极客大挑战 2019]EasySQL
    [极客大挑战2019]EasySQL题目来源:buuctf题目类型:web涉及考点:SQL注入先看题目,给了两个输入框:随便输入几个数进去,例如username=123,password=123:页面回显说是错误的用户密码,但注意到url中采用的是get传参:下一步寻找注入点,我们可以假设数据库中的查询语句为:select......
  • 洛谷 P6667 [清华集训2016] 如何优雅地求和
    洛谷传送门点值不好搞。考虑把它搞成系数一类的东西。由二项式反演,\(f(x)=\sum\limits_{i=0}^x\binom{x}{i}b_i\Leftrightarrowb_i=\sum\limits_{j=0}^i\binom{i}{j}(-1)^{i-j}f(j)\)。然后我们要求:\[\sum\limits_{k=0}^n\sum\limits_{i=0}^ms_i\bino......
  • day01
    变量变量的命名应该满足以下三个规范:1.变量的命名应该能反映变量值所描述的状态,切记不要用中文2.变量名可由字母、数字和下划线组成,但是不能以数字开头3.关键字不能声明为变量名以下为常见的几个变量名['and','as','assert','break','class','continue','def','del',......
  • AE cc 2017 和 2018 中英文切换的方法
    AEcc2017中文切换英文的方法找到AE的安装文件目录下的“SupportFiles”文件夹,路径为C:\ProgramFiles\Adobe\AdobeAfterEffectsCC2017\SupportFiles进入“zdictionaries”文件夹,找到该文件夹里的中文语言文件:“zh_CN”,并打开改文件名,把“after_effects_zh-CN.dat”改成......
  • MUR20100CTR-ASEMI快恢复20A 800V对管MUR20100CTR
    编辑:llMUR20100CTR-ASEMI快恢复20A800V对管MUR20100CTR型号:MUR20100CTR品牌:ASEMI芯片个数:2封装:TO-220恢复时间:50ns工作温度:-55°C~150°C浪涌电流:200A正向电流:20A反向耐压:1000V正向压降:1.7V引脚数量:3漏电流:>10uaMUR20100CTR特性:ASEMI品牌MUR20100CTR是采用工艺芯片......
  • [SDOI2010] 古代猪文
    题意求下列表达式的值\(\large{g^{\sum_{d|n}{\binom{n}{d}}}\pmod{999911659}}\)其中,\(n,d\leqslant10^9.\)Solution由欧拉定理可知,\(\large{原式=g^{\sum_{d|n}{\binom{n}{d}}\pmod{999911658}}}\)显然只需要考虑分子,考虑到\(999911658\)范围下的组合数无法......
  • JAVA设计模式之责任链模式
    设计模式设计模式(DesignPattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、......