装饰模式与代理模式

装饰模式:

定义:装饰模式以对客户端透明的方式动态扩展对象的功能(附加新的职责),是继承关系的一个替代方案。

角色:

  1)抽象构件角色(Component ):给出一个抽象接口,以规范接收附加责任的对象。

  2)具体构件角色(ConcreteComponent ):定义一个将要接受附加责任的类

  3)装饰角色(Decorator ):持有一个构件对象的实例,并定义一个与抽象构件一致的接口。

  4)具体装饰角色(ConcreteDecorator ):负责给构件对象贴上附加的责任。

特别注意:即装饰者和被装饰者具有相同的接口,这和代理模式很相似。

图:



 

 

意图:

把类中的装饰功能从类中移除,可以简化原有的类。

把类中的核心职责和装饰功能区分开来,而且可以去除相关类中重复的装饰逻辑。

动态添加对象到某个对象上。

缺点:

会导致比继承更多的对象,差错变得更加困难。

 

 

代理模式:

定义:为其他对象提供一种代理以控制对这个对象的访问。

角色:

1) 真实主题(ReadSubject):客户端实际要操作的对象。

  2) 代理(Proxy):代理中含有对真实主题(RealSubject) 的一个引用,可以对真实主题进行操作。

  3) 抽象主题(Subject):定义了真实主题和代理的共同操作的接口,这样在任何可以操作真实主题的地方也就可以操作代理。

图:



 

意图:

代理模式有效的向客户端屏蔽了附加行为细节,降低了客户端和系统之间的耦合度。

 

要点:

动态代理:

u     不用手工编写代理类;而是在运行时候动态生成;作用和手工生成的代理对象一致。

u     实现同一个接口:

u     创建java.lang.reflect.InvocationHandler,每个代理实例都有一个与它对应的InvocationHandler实例,就是一个方法拦截器。用以控制对某个对象的访问的拦截。

u     创建动态代理对象的步骤:

1)      指明一系列的接口来创建一个代理对象

2)      创建一个调用处理器Invocation handler 对象

3)      将这个代理指定为某个其他对象的代理对象

4)      在调用处理器的invoke()方法中采取代理,一方面将调用传递给真实对象,另一方面执行各种需要做的操作。

智能引用:

Java虚拟机对内存的管理能力是有限的,但有些应用又出于效率的考虑需要将一些较大的对象装载到内存中,为了保证虚拟机不会出现内存溢出,采用软引用,虚拟机在内存不够的时候能够回收较大的对象。采用智能引用能够保证一旦较大对象被回收后能够重新创建大对象保证客户端的正常使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值