分类: 设计模式

18 篇文章

十九、迭代器模式
Iterator Design Partern 作用 遍历容器实现复杂,并且方式有多种,例如遍历二叉树时,有前序、后序、中序遍历。将遍历容器从容器中独立出来,让两者的职责更单一。 容器使用的是迭代器接口,基于接口而非实现编程,替换迭代器更加容易。 示例 public class MyArrayList<E> implements Lis…
十八、代理模式
Proxy Design Pattern 作用 对原有功能进行增强,注意这里的增强是增加额外的功能,和原有功能无关。 使用场景 业务系统中增加非功能性需求,比如:监控、统计、鉴权、限流、事务、幂等、日志等。 还可以实现接口缓存,通过请求参数决定使用缓存还是实时查询。 实现方式 静态代理 代理接口 代理类和被代理类实现同样的接口,通过组合的形式,进行…
十七、访问者模式
Visitor pattern 因为它难理解、难实现,应用它会导致代码的可读性、可维护性变差,所以,访问者模式在实际的软件开发中很少被用到,在没有特别必要的情况下,建议你不要使用访问者模式。 ——设计模式之美 前言 这个模式侧重代码实现,主要是解决分离业务代码,抽取能力带来的问题。 示例V1 模拟读取不同格式的文件。 ResourceFileV1:…
十六、备忘录模式
Memento Design Pattern 定义 在不违背封装原则的情况下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后恢复对象为先前的状态。 应用场景 防丢失、撤销、恢复。可以理解为备份操作,只不过是从代码设计的层面来考虑的。 示例 来自极客时间 输入单词,支持撤销操作。 用户输入文本时,程序将其追加存储在内存文本中;用户输入“…
十五、状态模式
State Pattern 有限状态机 简称状态机, 由三部分组成:状态、事件、动作。事件触发状态转移,执行动作(非必须)。 状态机实现方式一:分支逻辑法 就是各种if else,switch case。判断不同的状态,遇到不同的事件,执行不同的操作,例如改变状态,执行动作。适用于简单的场景,毕竟不要过度设计。 状态机实现方式二:查表法 状态机有两…
十四、桥接模式
Bridge Design Pattern 两种理解方式 GoF的《设计模式》 桥接模式定义为:让抽象和实现解耦,让他们可以独立变化。这里的实现不是指语法上的实现接口、实现抽象方法,抽象也不是指接口或者抽象类。而是从业务的角度来定义的。例如JDBC定义了数据库访问层的规范,mysql数据库驱动实现了JDBC定义的规范,这里的JDBC和MySQL驱动…
十三、门面模式
Facade Design Pattern 前言 之前遇到过一个场景,绩效分为标注绩效,质检绩效,不同的公司展示不同的绩效。例如运营公司展示标注绩效,质检绩效;标注公司展示标注绩效;为了保证接口的单一职责,可复用性强,就把接口粒度控制得很小。导致的问题是,接口调用方需要根据不同情况调用一个或多个绩效接口,接口易用性差。 增加外观类 在现有基础上,“…
十二、命令模式
Command Design Pattern 定义 将命令(函数)封装成对象。 实现方式 Command public interface Command { void excute(); } ReadCommand public class ReadCommand implements Command { @Override public voi…
十一、组合模式
Composite Design Patten 定义 使用树形结构来表示业务场景里的数据,业务逻辑通过递归来实现,达到简化代码的目的。 适用场景 很局限,必须能用树形结构来表示。例如人员部门的组织机构,文件系统等。 注意 递归计算时,可以考虑将结果保存起来,不用每次使用时计算。但又会引发新的问题:改变一个节点,会影响所有父节点,这时候就得权衡了。
十、享元模式
Flyweight 定义 共享存储单元,节约内存空间。 使用场景 例如文本编辑器里,每个字符都有字体大小,显示颜色,背景颜色等属性。将这些属性抽取为字体,每个字体的属性在内存中只保留一份即可。感觉和CSS挺像的,不过享元模式侧重点不是代码复用,而是对象复用。 JDK里使用的地方 Integer缓存 int类型在自动装箱时,调用java.lang.I…