关于代理模式的个人理解

Proxy代理模式是一种结构设计模式。主要是解决直接访问对象所带来的问题。

代理,分为动态代理和静态代理。

Subject : 抽象接口

RealSubject:抽象接口的实现类

Proxy:代理类,实现Subject。持有RealSubject对象的实例,其中所有的方法都是调用 RealSubject 来实现。

Proxy 代理类因为是通过调用 RealSubject 来实现,所以就可以在 RealSubject 的方法调用之前以及之后做一些事情,也就是所谓的面向切面编程(AOP)。

静态代理,顾名思意,所要代理类是直接编写在Java代码中的,在编译时就已经固定下来。而动态代理,则是在运行时才实际生成代理类。


JDK 动态代理示例代码:

package com.java.test.jvm;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class DynamicProxyTest {

    interface IHello {
        void sayHello();
    }

    static class Hello implements IHello {

        @Override
        public void sayHello() {
            System.out.println("hello world");
        }
    }

    static class DynamicProxy implements InvocationHandler {

        Object originalObj;

        Object bind(Object originalObj) {
            this.originalObj = originalObj;
            //在这里就会生成一个代理对象,实现目标接口,也就是第二个参数传入的方法。然后自动生成的对象就就会去实现目标接口
            return Proxy.newProxyInstance(originalObj.getClass().getClassLoader(),
                    originalObj.getClass().getInterfaces(),
                    this);
        }


        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("welcome");
            return method.invoke(originalObj, args);
        }

    }

    public static void main(String[] args) {
        IHello hello = (IHello) new DynamicProxy().bind(new Hello());
        hello.sayHello();
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代理模式是一种结构型设计模式,它允许将对象的访问控制委托给另一个对象。在代理模式中,代理对象控制着原始对象的访问,并可以在原始对象的方法执行前或后添加自定义逻辑。以下是一个简单的 Java 代码示例,演示了如何使用代理模式: ```java // 定义一个接口 interface Image { void display(); } // 定义一个实现了 Image 接口的具体类 class RealImage implements Image { private String fileName; public RealImage(String fileName) { this.fileName = fileName; loadFromDisk(); } @Override public void display() { System.out.println("Displaying " + fileName); } private void loadFromDisk() { System.out.println("Loading " + fileName); } } // 定义一个代理类 class ProxyImage implements Image { private RealImage realImage; private String fileName; public ProxyImage(String fileName) { this.fileName = fileName; } @Override public void display() { if (realImage == null) { realImage = new RealImage(fileName); } realImage.display(); } } // 使用代理类访问实际对象 public class ProxyPatternDemo { public static void main(String[] args) { Image image = new ProxyImage("test_image.jpg"); // 在第一次访问时,会创建实际的对象并加载它 image.display(); // 在第二次访问时,不会创建实际的对象,而是直接访问代理对象 image.display(); } } ``` 在上面的示例中,`Image` 是一个接口,包含 `display()` 方法。`RealImage` 是一个实现 `Image` 接口的具体类,它负责加载和显示图像。`ProxyImage` 是一个代理类,它也实现了 `Image` 接口,并在需要时创建实际的 `RealImage` 对象,以确保对其的访问受到控制。 在 `main()` 方法中,我们创建了一个 `ProxyImage` 对象,并将其传递给 `Image` 接口的引用。在第一次调用 `display()` 方法时,代理类创建了实际的 `RealImage` 对象,并调用其 `display()` 方法。在第二次调用 `display()` 方法时,代理类直接调用实际对象的 `display()` 方法,而不需要再创建它。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值