设计模式:门面模式(Facade Pattern)
定义
动态地给一个对象添加一些额外的职责。就增加功能来说,它相比生成子类更为灵活
类型
结构类模式
类图
代码实现
1 | public class ClassA { |
优点
- 减少系统的互相依赖
- 提高了灵活性
- 提高安全性
缺点
不符合开闭原则
使用场景
- 为一个复杂的模块或子系统提供一个供外界访问的接口
- 子系统相对独立——外界对子系统的访问只要黑箱操作即可
- 预防低水平人员带来的风险扩散
动态地给一个对象添加一些额外的职责。就增加功能来说,它相比生成子类更为灵活
结构类模式
1 | public class ClassA { |
不符合开闭原则
动态地给一个对象添加一些额外的职责。就增加功能来说,它相比生成子类更为灵活
结构类模式
1 | public abstract class Flyweight{ |
大大减少应用程序创建的对象,减低程序内的占用,增强程序的性能
## 缺点
提高了系统的复杂性,需要分离出外部状态和内部状态。
动态地给一个对象添加一些额外的职责。就增加功能来说,它相比生成子类更为灵活
结构类模式
1 | public abstract class Component { |
## 缺点
多层的装饰是比较复杂的,尽量减少装饰类的数量,以便降低系统的复杂度。
将对象组合成树型结构,以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
结构类模式
1 | public abstract class Component { |
树叶和树枝使用时直接使用了实现类,在面向接口编程上是很不恰当的,与依赖倒置原则冲突。
## 使用场景
将抽象和实现解耦,使得两者可以独立的变化
结构类模式
1 | public interface Implementor { |
为其他对象提供一种代理以控制对这个对象的访问
结构类模式
1 | public interface Subject { |
讲一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够一起工作
结构类模式
1 | public interface Target { |
在详细设计阶段不用考虑,而是解决正在复议的项目的问题
当一个对象内在状态改变时允许其改变行为,这个对象看起来像是改变了其类。
创建类模式
State——抽象状态角色
接口抽象类,负责对象状态定义,并且封装环境角色以实现状态转换。
ConcreteState——具体状态角色
每一个具体状态必须完成两个职责: 本状态的行为管理以及趋向状态处理,通俗地说,就是本状态下要做的事情,以及本状态如何过渡到其他状态
Context——环境角色
定义客户端需要的接口,并且负责具体状态的切换。
1 | public abstract class State { |
结构清晰
避免许多switch…case
遵循设计原则
很好地体现了开闭原则和单一职责原则
子类会太多,可以解决,比如在数据库中建立一个状态表,然后根据状态执行相应的操作。
给定一种语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子。
行为类模式
1 | class Context {} |
解释器是一个简单的语法分析工具,它最显著的优点就是扩展性,修改语法规则只需要修改相应的非终结符就可以了,若扩展语法,只需要增加非终结符类就可以了。
解释器模式会引起类的膨胀,每个语法都需要产生一个非终结符表达式,语法规则比较复杂时,就可能产生大量的类文件,为维护带来非常多的麻烦。同时,由于采用递归调用方法,每个非终结符表达式只关心与自己相关的表达式,每个表达式需要知道最终的结果,必须通过递归方式,无论是面向对象的语言还是面向过程的语言,递归都是一个不推荐的方式。由于使用了大量的循环和递归,效率是一个不容忽视的问题。特别是用于解释一个解析复杂、冗长的语法时,效率是难以忍受的。
在以下情况下可以使用解释器模式:
解释器模式真的是一个比较少用的模式,因为对它的维护实在是太麻烦了,想象一下,一坨一坨的非终结符解释器,假如不是事先对文法的规则了如指掌,或者是文法特别简单,则很难读懂它的逻辑。解释器模式在实际的系统开发中使用的很少,因为他会引起效率、性能以及维护等问题。
提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。
行为类模式
1 | interface Iterator { |
对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐,大家可能都有感觉,像ArrayList,我们宁可愿意使用for循环和get方法来遍历集合。
Nothing to say
Front-End Development Engineer