代理模式和装饰者模式区别

  1. 静态代理需要手动实现被代理接口的所有方法,而动态代理通过反射可以自动代理接口的所有方法
  2. 静态代理在编译的时候就生成了代理类的class文件;动态代理在运行的时候动态生成代理类
  3. 代理模式有很多用途:比如在方法调用前后添加日志;AIDL中就生成了远程接口的代理类,代理类帮助我们实现Binder底层的跨进程通信机制,让客户端用起来跟本地调用一样;日志系统、事务、拦截器、权限控制等。
  4. 代理的优点:如果我们要为具体类增加功能的时候,我们只需要在代理类上调用具体类方法的前后进行处理就好了,避免了修改具体实现类,符合开闭原则
  5. 静态代理的缺点:代理类需要跟委托类实现相同的接口,会出现大量的代码重复;当接口增加方法的时候,也要在代理类中添加相应方法。
  6. 使用动态代理可以统一对委托类的所有方法在InvokeHandler的invoke中进行处理
  7. 代理模式符合面向切面编程(AOP)思想,它强调在切入点的前后做增强处理

(1)远程代理:Binder的代理模式就是使用此方式,为某个对象在不同内存地址空间提供局部代理,屏蔽了跨进程通信的具体细节,这样Client端不需要考虑Server的存在;

(2)保护代理:使用代理控制对原始对象的访问,常常用于对原始对象有不同访问权限的地方。

(3)智能引用:使用代理来访问某个对象,并在代理中对对象进行引用计数来维护对象的声明周期。

装饰者模式:Java里面的IO类。透明地动态地扩展类的功能,比如我们给FileInputStream添加一个缓存读取的功能,就可以这样做:

BufferedInputStream in = new BufferedInputStream(new FileInputStream("filename"));

区别:
1. 装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。
2. 有的代理模式的被代理对象可以在编译时确定下来,而装饰者的被装饰类是在运行时动态设定的:

//客户不知道代理委托了另一个对象
Subject subject = new Proxy();
//客户需要指定被装饰的对象
InputStream in = new BufferedInputStream(new FileInputStream("filename"));

静态代理和动态代理

  1. 静态代理需要手动实现被代理接口的所有方法,而动态代理通过反射可以自动代理接口的所有方法
  2. 静态代理在编译的时候就生成了代理类的class文件;动态代理在运行的时候动态生成代理类
  3. 代理模式有很多用途:比如在方法调用前后添加日志;AIDL中就生成了远程接口的代理类,代理类帮助我们实现Binder底层的跨进程通信机制,让客户端用起来跟本地调用一样;日志系统、事务、拦截器、权限控制等。
  4. 代理的优点:如果我们要为具体类增加功能的时候,我们只需要在代理类上调用具体类方法的前后进行处理就好了,避免了修改具体实现类,符合开闭原则
  5. 静态代理的缺点:代理类需要跟委托类实现相同的接口,会出现大量的代码重复;当接口增加方法的时候,也要在代理类中添加相应方法。
  6. 使用动态代理可以统一对委托类的所有方法在InvokeHandler的invoke中进行处理
  7. 代理模式符合面向切面编程(AOP)思想,它强调在切入点的前后做增强处理

(1)远程代理:Binder的代理模式就是使用此方式,为某个对象在不同内存地址空间提供局部代理,屏蔽了跨进程通信的具体细节,这样Client端不需要考虑Server的存在;

(2)保护代理:使用代理控制对原始对象的访问,常常用于对原始对象有不同访问权限的地方。

(3)智能引用:使用代理来访问某个对象,并在代理中对对象进行引用计数来维护对象的声明周期。

装饰者模式:Java里面的IO类。透明地动态地扩展类的功能,比如我们给FileInputStream添加一个缓存读取的功能,就可以这样做:

BufferedInputStream in = new BufferedInputStream(new FileInputStream("filename"));

区别:
(1)装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。

(2) 有的代理模式的被代理对象可以在编译时确定下来,而装饰者的被装饰类是在运行时动态设定的:

//客户不知道代理委托了另一个对象
Subject subject = new Proxy();
//客户需要指定被装饰的对象
BufferedInputStream in = new BufferedInputStream(new FileInputStream("filename"));

(3) 装饰者除了实现被装饰者的接口以外,可以添加额外的方法来增强功能,比如DataInputStream,提供了从InputStream中读取Java基本数据类型的方法:
这里写图片描述

代理模式装饰模式是两种常见的设计模式,它们都属于结构型设计模式,但在功能使用场景上有所不同。 1. 代理模式代理模式是通过创建一个代理对象来控制对原始对象的访问。代理对象与原始对象具有相同的接口,客户端无需知道实际的对象是代理对象还是原始对象。代理模式常用于以下情况: - 远程代理:代理对象可以代表远程的对象,使得客户端可以通过网络访问远程对象。 - 虚拟代理:代理对象可以在需要时创建昂贵的对象,以提高性能。 - 安全代理:代理对象可以控制对原始对象的访问权限。 2. 装饰模式装饰模式是在不改变原始对象接口的情况下,动态地给对象添加额外的功能。装饰模式通过创建一个装饰者类,将原始对象作为参数传入,并在装饰者类中添加额外的功能。装饰模式常用于以下情况: - 在不修改现有代码的情况下,给对象添加新的行为。 - 需要动态地给对象添加功能,而不是静态地在编译时确定。 适配器模式是另一种常见的设计模式,它用于将一个类的接口转换成客户端所期望的另一个接口。适配器模式常用于以下情况: - 将一个已存在的类集成到另一个接口中。 - 使得原本不兼容的类可以一起工作。 区别: - 代理模式装饰模式都是通过创建一个中间对象来控制对原始对象的访问,但代理模式更关注对对象的访问控制,而装饰模式更关注对对象的功能扩展。 - 代理模式通常在不改变原始对象接口的情况下,对对象进行控制,而装饰模式则通过扩展对象的功能来实现。 - 适配器模式主要用于接口的转换,将一个类的接口转换成另一个接口,而代理模式装饰模式则是在不改变接口的情况下对对象进行控制或扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值