• java代理


    什么是代理

    代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.

    这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法

    java中的代理模式:

            定义:给目标对象提供一个代理对象,并且由代理对象控制对目标对象的引用

            目的:1:通过代理对象的方式间接的访问目标对象,防止直接访问目标对象给系统带来不必 要的复杂性:2:通过代理业务对原有业务进行增强

     java创建代理对象:

    静态代理,基于jdk(接口)的动态代理,基于CGLLIB(父类)的动态代理。

    相关概念:

            目标类:原对象,我们需要代理对象控制他的访问,拓展其功能。

            代理类:代理模式产生的对象,是原对象“替身”,已经在原有基础上修改逻辑

    静态代理

    编写代理类:实现目标的接口或者直接继承目标类,完成逻辑的修改

    接口实现方式:

    关于接口的方式,我们在实现接口的时候,目标类和代理类都必须实现目标接口当中所实现的方法,从某种意义上代理类就可以帮我们实现目标类当中的方法,并且代理类还可以有自己的扩展方法。

    举例子:

    最开始我们想买东西就必须代购,因为只有代购员才知道真实的工厂在哪里

    代码实现:

    首先定义接口------相当于工厂地址和功能

    1. public interface ByClothes {
    2.     void clothes(String size);
    3. }
    4. 定义目标对象---制造衣服的工厂
    5. public class ClothesFactory implements ByClothes {
    6.     @Override
    7.     public void clothes(String size) {
    8.         System.out.println("已经为您制作好了一整套size为"+size+"的衣服。。。。。。。。");
    9.     }
    10. }
    11. 制造代理对象-------代购
    12. public class proxy implements ByClothes {
    13.  
    14.     
    15.     //被包含的真是对象
    16.     public ClothesFactory factory;
    17.     
    18.     public proxy(ClothesFactory factory) {
    19.         // TODO Auto-generated constructor stub
    20.         this.factory = factory;
    21.     }
    22.     
    23.     @Override
    24.     public void clothes(String size) {
    25.         FrontService();
    26.         factory.clothes(size);
    27.         endService();
    28.         
    29.     }
    30.     
    31.     //前置服务
    32.     public void FrontService() {
    33.         System.out.println("根据您的需求进行市场调研");
    34.     }
    35.  
    36.     //前置服务
    37.     public void endService() {
    38.         System.out.println("为您提供一条龙的包办服务");
    39.     }
    40. }

    制造测试类------买衣服的人

    1. public class Test {
    2.     public static void main(String[] args) {
    3.         ClothesFactory clothesFactory = new ClothesFactory();
    4.         proxy proxy = new proxy(clothesFactory);
    5.         proxy.clothes("XXl");
    6.     }
    7. }

    真实静态代理

    细节:我们的目标对象必须实现我们的接口,同时代理对象也必须实现这一接口

     

    静态代理存在哪些问题?

    违反了开闭原则:

    程序对访问开放,对修改关闭,换句话来说,当需求发生变化时,我们可以增加新模块来解决新需求,而不是通过改变原来的代码来解决我们的新需求

    动态代理:

    举例子:

    当发现这是一个商机的时候,聚拢身边的朋友成立公司

    公司的优势:可以代购很多种商品,不是定性的代购

    java实现:

    1.新建接口

    1. public interface ByShoot {
    2.     void byShoot(String size);
    3. }

    2.新建工厂

    1. public class ShootFactory implements ByShoot{
    2.  
    3.     @Override
    4.     public void byShoot(String size) {
    5.         System.out.println("已经为您生产出了尺码为"+size+"的鞋子");
    6.     }
    7.  
    8. }

    3.新建海外代购公司

    1. public class LisiFactory implements InvocationHandler {
    2.  
    3.     // 被代理的对象
    4.     private Object factory ;
    5.  
    6.     public Object getFactory() {
    7.         return factory;
    8.     }
    9.  
    10.     public void setFactory(Object factory) {
    11.         this.factory = factory;
    12.     }
    13.  
    14.     //ssm: Spring SpringMVC mybitys
    15.     //Spring:AOP IOC +....
    16.     //AOP:代理    (面向切面的编程)
    17.     // 通过代理对象对方法进行增强
    18.     @Override
    19.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    20.         FrontService();
    21.         Object retObject = method.invoke(factory, args);  //这里用了反射的思想,因为我们不知道调用的是那个工厂的那个方法
    22.         endService();
    23.         return null;
    24.     }
    25.  
    26.     // 前置服务
    27.     public void FrontService() {
    28.         System.out.println("根据您的需求进行市场调研");
    29.     }
    30.  
    31.     // 后置服务
    32.     public void endService() {
    33.         System.out.println("为您提供一条龙的包办服务");
    34.     }
    35.     
    36.     //调度员工
    37.     /**
    38.     * 1 新建一名员工
    39.      * 2.告诉员工工厂地址
    40.      * this:绑定
    41.      * @return
    42.      */
    43.     public Object getProxyInstance() {
    44.         // TODO Auto-generated method stub
    45.         return Proxy.newProxyInstance(factory.getClass().getClassLoader(), factory.getClass().getInterfaces(), this);
    46.     }
    47.     
    48.     
    49. }

    4.新建测试类---买东西的人

    1. public class Test {
    2.     public static void main(String[] args) {
    3.         ClothesFactory clothesFactory = new ClothesFactory();
    4.         ShootFactory shootFactory = new ShootFactory();
    5.         LisiFactory lisiFactory = new LisiFactory();
    6.         lisiFactory.setFactory(shootFactory);
    7.         ByShoot yuangong1 = (ByShoot) lisiFactory.getProxyInstance();
    8.         yuangong1.byShoot("42");
    9.         lisiFactory.setFactory(clothesFactory);
    10.         ByClothes yuangong  = (ByClothes) lisiFactory.getProxyInstance();
    11.         yuangong.clothes("XXL");
    12.     }
    13. }

     

  • 相关阅读:
    Flutter_Slider_SliderTheme_滑杆/滑块_渐变色
    查题接口 开放后台 不限次数调用
    滤波算法_扩展卡尔曼滤波(EKF, Extended Kalman filter)_全网最详细的数学推导_Part1
    C/C++ 快速入门
    Django日志集成 & MySQL/Redis 异常捕获
    CocosCreator | 2.3.3及后续版本浏览器无法断点和控制台不显示错误代码路径的解决方案(cocos代码报错无法定位的问题)
    【Linux】进程间通信(学习复习兼顾)
    Day720. 外部内存接口 -Java8后最重要新特性
    不平衡之钥: 重加权法知几何
    短信验证码
  • 原文地址:https://blog.csdn.net/LiZhen314/article/details/126160032