设计模式学习——装饰、适配、观察者
装饰器模式
意图
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
主要解决
一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。
何时使用
在不想增加很多子类的情况下扩展类。
自我理解
类似于AOP这种面向切面编程。不过AOP本质是使用动态代理实现。如果我现在维护一个现存的老系统。该系统中有一个接口方法,新需要需要针对这个接口进行功能的扩展。比如需求是要求每次调用该接口的时候的时候,我计算服务器时间,如果在允许的时间内,可以调用该接口。在非授权时间范围中,不允许调用。如果此时我直接改接口中的源码,就不符合6大设计模式原则。
适配器模式
意图
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
主要解决
主要解决在软件系统中,常常要将一些”现存的对象”放到新的环境中,而新环境要求的接口是现对象不能满足的。
何时使用
- 系统需要使用现有的类,而此类的接口不符合系统的需要。
- 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。
- 通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)
自我理解
在维护的旧系统中,有一个开发新增了一个已有的类似的功能给我。但是要调用其中一个service层的接口。由于是多个人开发的,接口的参数不同,我不能修改别人的接口,只能调用。此时,为了保持新老的一致性,采用适配器模式,调用新接口,使其符合老接口的用法。
观察者模式
意图
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
主要解决
一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
何时使用
一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
自我理解
在开发一个新的功能需求时,对消息的即时通知功能要求很高时,可以采用该设计模式。比如之前我做mqtt协议的服务器主动推送时,就采用该设计模式。客户端主动连接mqtt服务器,连接一直在监听服务器端有没有消息发送过来。当有消息过来时,立马通知消息处理逻辑进行业务的处理。