设计模式-代理、职责链

137 阅读4分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

一、代理模式

定义: 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。

理解: 有些时候不能或者不想直接访问某一个对象,就需要找一个中介来完成,就可以很好的使用代理对象。例如租房子,我们不想一个个的去联系房东,这个时候就可以联系一个中介,由中介代理我们去处理。代理模式主要有3个角色,抽象主题类通过接口或抽象类声明真实主题和代理对象实现的业务方法;真实主题类实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象;代理类,提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。代理又分静态代理和动态代理。静态代理是程序员创建代理类或特定工具自动生成源代码再对其编译,在程序运行前代理类的 .class 文件就已经存在了。动态代理在程序运行的时候利用发射机制动态创建。

优点: 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;代理对象可以扩展目标对象的功能;

缺点: 代理模式会造成系统设计中类的数量增加,增加了系统复杂度;在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;

场景: 客户端对象需要访问远程主机中的对象时可以使用远程代理;需要控制不同种类客户对真实对象的访问权限可以使用安全代理;要创建的目标对象开销很大时可以使用虚拟代理;调用目标对象时需要附加一下额外处理可以使用智能引用代理。

二、职责链模式

定义: 为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

理解: 职责链就是客户只管将请求发送到职责链上,不用关心这个过程中的处理细节,请求会自动传递,实现了请求的发送者和请求的处理者的解耦。例如我们的流程审批,只需要提交流程,其中的上级审批,人事登记等我们不用关心,只管后面的结果就行。职责链包含3个角色,抽象处理者角色定义一个处理请求的接口,包含抽象处理方法和一个后继连接;具体处理者角色实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者;客户类角色创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

优点: 降低了对象之间的耦合度;增强系统的可扩展性,可以根据需要增加新的类,满足开闭原则;提高灵活性,当工作流程发生变化,可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任。某个类只需要处理自己的工作,明确了职责范围,符合第一职责原则;

缺点: 不能保证每个请求一定被处理;如果职责链较长,请求处理可能经过多个对象,对系统性能有一定影响;需要客户端保证职责链的合理性,增加客户端复杂性,可能存在职责链设置错误导致循环调用;

场景: 需要动态指定一组对象处理请求;在请求处理者不明确的情况下向多个对象中的一个提交请求;有多个对象处理同一个请求,但具体由哪个对象处理不确定,可以使用职责链,将请求交给职责链处理。