设计模式:代理模式(Proxy)

代理模式 给某一对象提供一个代理对象,并由代理对象控制对原对象的引用。属于结构型模式。

代理模式在生活中有具体的表现,例如找代理售票点(或黄牛)买票,网络代理。

阅读更多

设计模式:享元模式(Flyweight)

享元模式 尝试复用同类或相似的对象,以共享方式高效地支持大量的细粒度对象,减少面向对象的系统设计中可能创建大量类或对象,以减少内存占用和提高性能。

享元模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。

面向对象设计可以很好地解决一些灵活性或可扩展性问题,但在大多数情况下需要在系统中增加类和对象的个数。当对象数量过多时,会占用较大内存,甚至导致内存溢出,运行代价过高,带来性能下降等问题。

阅读更多

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

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

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

阅读更多

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

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

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

阅读更多

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

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

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

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

阅读更多

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

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

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

阅读更多

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

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

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

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

阅读更多

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

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

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

阅读更多

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

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

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

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

阅读更多