个人笔记分享:代理模式

结构型模式包括:代理模式、桥接模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式。

代理模式的好处?

可以增强原类的功能,在函数执行前后做一些额外的操作。

代理模式的种类?

动态代理和静态代理。

静态代理和动态代理的区别?

静态代理需要我们自己写一个代理类。

动态代理系统自动帮我们生成一个代理类。

静态代理是在编译期间就需要完成的,相当于每个类都要创建一个代理类,这样的代码冗余量很大。

JDK提供的动态代理要求类实现invokationHandler接口,然后在运行时才去创建代理类,解决了静态代理代码冗余的问题。

静态代理的例子?

写一个接口,然后被代理类实现接口,代理类也实现接口。

// 定义一个名为Person的接口,其中包含一个名为doWork()的方法声明
interface Person {
    void doWork();
}

// 实现Person接口的Student类
class Student implements Person {
    // 重写doWork()方法以提供其实现
    public void doWork() {
        System.out.println("学习");  // 当方法被调用时打印"学习"
    }
}

// 同样实现Person接口的StartWorkingBoy类,该类有一个Person类型的成员变量
class StartWorkingBoy implements Person {
    private Person person;  // 类型为Person的成员变量,用于引用

    // 构造函数,初始化person成员变量
    public StartWorkingBoy(Person person) { this.person = person; }

    // 重写doWork()方法以提供其实现
    @Override 
    public void doWork() {
        System.out.println("找到一份工作");  // 当方法被调用时打印"找到一份工作"
        person.doWork();  // 调用person对象的doWork()方法
        System.out.println("开始挣钱养家------");  // 在调用doWork()后打印额外的信息
     }
}

动态代理有几种?

jdk动态代理和spring动态代理。

jdk动态代理的例子

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        List<String> proxyInstance = (List<String>) Proxy.newProxyInstance(list.getClass().getClassLoader(), list.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("开始执行" + method.getName());
                if (method.getName().equals("toString")) {
                    System.out.println("特殊方法");
                }
                // 必须是原对象
                Object invoke = method.invoke(list, args);
                System.out.println("结束执行" + method.getName());
                return invoke;
            }
        });
        proxyInstance.add("xxx");
        System.out.println(proxyInstance);
    }

spring底层是如何抉择使用哪种动态代理的?

由于反射已经被优化了,jdk动态代理速度也很快了,所以实现了接口的话,使用jdk动态代理,不然使用cglib。

全部评论

相关推荐

RESTful&nbsp;API是一种基于HTTP协议的Web服务架构风格,它以资源为中心,通过HTTP方法(如GET、POST、PUT、DELETE)对资源进行操作。下面是一些常见的RESTful&nbsp;API设计规范和最佳实践:https://www.nowcoder.com/issue/tutorial?zhuanlanId=Mg58Em&amp;uuid=b48bebe08e474db8b80b853b12bafd48#牛客AI配图神器#使用清晰的资源命名:API的端点应该使用名词,而不是动词。例如,使用&quot;/users&quot;来表示用户资源的集合,使用&quot;/users/{id}&quot;来表示单个用户资源。使用HTTP方法进行操作:使用HTTP的不同方法(GET、POST、PUT、DELETE)对资源进行不同的操作。GET用于获取资源,POST用于创建资源,PUT用于更新资源,DELETE用于删除资源。使用HTTP状态码:正确使用HTTP状态码可以提供有关请求结果的信息。常见的状态码有200表示成功,201表示资源创建成功,400表示客户端请求错误,404表示资源不存在等。使用资源版本控制:在API中引入版本控制是一种良好的实践,可以确保对API进行更改时不会破坏现有的客户端应用程序。使用合适的数据格式:常见的数据格式包括JSON和XML,但根据需求也可以选择其他的格式。JSON是当前最常用的格式,因为它是轻量级的、易于阅读和解析的。使用正确的HTTP头部信息:使用合适的Content-Type头部信息来指示请求或响应中的数据格式,并使用合适的Accept头部信息来指示客户端期望的响应数据格式。使用URI来表示关系:在URL中使用合适的路径表示资源之间的层次关系或关联关系,遵循RESTful风格。提供合适的错误处理:在API中,要提供清晰和有用的错误信息,包括错误代码、错误消息和可能的解决方案。使用认证和授权机制:对于需要身份验证和授权的API操作,应该实施适当的安全措施,如使用API密钥、OAuth等来保护资源的访问。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务