设计模式:中介者模式(Mediator)

中介者模式是把多对象之间存在复杂的网状结构的交互关系,改为 星形结构,这样大大降低对之间的的耦合,所有对象只通过 中介者 与目标对象联系。

中介者例子:人才交流中心,房产中介,WTO(世界贸易组织), MVC框架中的 C(控制器)就是 M(模型)和 V(视图)的中介者。

阅读更多

设计模式:桥接模式(Bridge)

桥接模式:将抽象与实现分离,使它们可以独立变化。它是用组合关系替代继承关系,而从降低了抽象实现这两个可变维度的耦合度。

桥接模式不是一个使用频率很高的模式,但是熟悉这个模式对于理解面向对象的设计原则,包括 开-闭原则(OCP) 以及 组个/聚合原则(CARP)都很有帮助。理解好这两个原则,有助于形成正确的设计思想和培养良好的设计风格。

阅读更多

设计模式:外观模式(Facade)

当一个系统功能越来越强,子系统越来越多时,客户对系统的访问会随之变得越来越复杂。

特别是当前微服务架构的流行,子系统数量快速膨胀,这时要完成一笔业务,需要跨越多个子系统;如果子系统内部发生改变,客户端也要跟着改变,这违背了 开闭原则,也违背了迪米特法则

所以就有必要是为多个子系统提供一个统一的门面(外观对象),客户端只与 门面 通信,通过 门面 来隐藏系统的复杂性,降低耦合度,这就是外观模式的作用。

阅读更多

设计模式:装饰模式(Decorator)

装饰器模式 又称 包装模式。装饰模式以对客户透明的方式,在不改变对象结构的情况下,可以动态地扩展其功能。

装饰器模式是继承关系的一个替代方案,可以在不使用创造更多子类的情况下,扩展对象的功能。

阅读更多

统一建模语言UML及类图关系

UML 即统一建模语言,是目前最常用的建模工具,已成为当今软件设计的标准图标式设计语言。

所谓统一,指的是在 UML 之前,软件建模工具和方法有很多种,最后业界达成共识,用 UML 统一软件建模工具。

所谓建模,就是用 UML 对领域业务问题和软件系统进行设计抽象,一个工具完成软件开发过程中的两个客观存在的建模。

阅读更多

设计模式(十五):策略模式(Strategy Pattern)实际应用

要在实际项目中应用策略模式,最好先仔细了解策略模式的定义和相关概念,可参考 设计模式(九):策略模式(Strategy Pattern)

策略模式(Strategy Pattern):定义一系列算法(算法家族),并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。

使用了策略模式,在系统设计层面是满足 里氏替换原则开放封闭原则 的,每个算法可以相互替换,在不修改已有算法的情况下易于扩展。

阅读更多

数据结构与算法(五):FIFO, LRU, LFU 缓存淘汰算法

服务器内存有限,不可能持续地往内存中存入数据,就需要对内存中的数据进行淘汰处理,通过制定淘汰策略(算法)以保证内存持续可用,使内存中的数据价值最大化。

应用层的缓存淘汰算法基本都是借用操作系统的内存管理算法,以称为内存页置换算法。

阅读更多

设计模式(十四):模版方法模式(Template Method Pattern)

模版方法模式是非常常见的模式,并且用户往往使用了模板方法模式而没意思到自己已经使用了这个模式。模板方法模式是行为模式。

生活中在做某些事情时,往往存在重复的步骤,例如用户银行办事,有要办存款,办取款等,但都需要经过 取号,填单,排队,等叫号这些步骤,这些重复的步骤延伸到软件设计里就可以对其进行抽象,在抽象类里定义流程或格式(方法的调用方式(步骤的顺序)),子类继承并且可按需重写方法(步骤)。例如,简历模板,论文模板等。

阅读更多

设计模式(十三):适配器模式(Adapter)

在现实生活中,经常出现两个对象因接口不兼容而不能在一起工作的实例,这时需要第三者进行适配(转换)。例如,使用电脑电源适配器将220V家用电转换为电脑需要的电。

在软件设计中,也可能出现需要的功能在现有的组件库中已存在,但与现有系统并不兼容,这时使用适配器模式就可以将并不兼容的接口转换为客户希望的目标接口。

使用适配器模式来处理像货物的包装过程,被包装的货物的真实样子被包装所掩盖和改变,因此也被叫做包装(Wrapper)模式。

阅读更多

设计模式(十二):责任链模式(Chain of Responsibility)

生活或工作中经常会遇到一种情境,即要完成或处理某件任务时,需要经过层层传递到某一层级才能得到处理。

例如,加薪审批,直接的小组长可能并没有权限,需要向上报批,可能需要经过好几层到副总级别才得到处理。例如,击鼓传花游戏,花在多个人之间传递把大家连接起来,鼓声落,谁持有花谁就喝酒。

这种情境在软件设计中也是存在的,多个对象之间相互引用而形成一条链,最终链中的某一个对象处理了任务,而客户端并不需要知道具体是谁处理的,对象也不需要知道任务具体来自谁, 这就是责任链的最简单模型。

阅读更多