设计模式
子知识库
文章
4.3 解释器
意图 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 Given a language, define a represention for its grammar along with aninterpreter that uses the representation to interpret sentences in the language. 结构 参与者 AbstractExpression 声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。 TerminalExpression 实现与文法中的终结符相关联的解释操作。 一个句子中的每一个终结符需要该类的一个实例。 NonterminalExpression 对文法中的规则的解释操作。 Context 包含解释器之外的一些全局信息。 Client 构建表示该语法定义的语言中一个特定的句子的抽象语法树。 调用解释操作 适用性 当有个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可以使用Interpreter 模...
4.4 迭代器
迭代器概念意图提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。 结构 参与者Iterator 迭代器定义访问和遍历元素的接口。 ConcreteIterator 具体迭代器实现迭代器接口。 对该聚合遍历时跟踪当前位置。 Aggregate 聚合定义创建相应迭代器对象的接口。 ConcreteAggregate 具体聚合实现创建相应迭代器的接口,该操作返回 ConreteIterator 的实例。 适用性在以下情况下可以使用 Iterator 模式: 访问一个聚合对象的内容而无需暴露它的内部表示。 支持对聚合对象的多种遍历。 为遍历不同的聚合结构提供一个统一的接口。 效果 它支持以不同的方式遍历一个聚合。 迭代器简化了聚合的接口。 在同一个聚合上可以有多个遍历。 相关模式 Iterator 常被应用到 Composite 这样的递归结构上。 可以使用 Factory Method 模式来实例化多态迭代器。 Iterator 可以使用 Memento 来捕获一个迭代的状态,在内部存储 Memento。 Imple...
4.5 中介者
意图 用一个中介对象来封装一系列的对象交互。 中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each otherexplicitly, and it lets you vary their interaction independently. 结构 一个典型的对象结构: 参与者 Mediator 中介者定义一个接口用于与各同事对象通信。 ConcreteMediator 具体中介者通过协调各同事对象实现协作行为。 了解并维护它的各个同事。 Colleague 每一个同事类都知道它的中介者。 每一个同事对象在需与其他同事通信时,与它的中介者通信。 适用性 在以下情况下可以使用 Mediator 模式: 一组对象定义良好但是使用复杂的通信方式。产生的...
4.6 备忘录
备忘录模式别名 Token 意图 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 结构 参与者 Originator:原始对象 Caretaker:负责保存好备忘录 Memento:备忘录,存储原始对象的状态。备忘录实际上有两个接口,一个是提供给 Caretaker 的窄接口:它只能将备忘录传递给其它对象;一个是提供给 Originator 的宽接口,允许它访问到先前状态所需的所有数据。理想情况是只允许 Originator 访问本备忘录的内部状态。 适用性 在以下情况下可以使用 Memento 模式: 必须保存一个对象在某一个时刻的状态,这样以后需要时它才能恢复到先前的状态。 如果一个用接口来让其他对象直接得到的这些状态,将会暴露对象的实现细节并破坏对象的封装性。 效果 保持封装边界。 简化了 Originator。 定义窄接口和宽接口。 使用和维护 Memento 的潜在代价。 相关模式 可以使用 Memento 存储 Command 的内部状态,以支持撤销操作。 Memen...
4.7 观察者
观察者模式别名 Dependency Publish-Subscribe 观察者模式好牛啊,在不同的代码层次有这不同的名称但是大同小异。 在java代码层就是观察着模式 在socket网络编程、IO编程中(netty、springWebFlux、sofarpc)就是Reactor模式 在操作系统中就是IO多路复用的一种策略 在UI框架中就是Listener,事件监听机制和响应机制 在Spring框架中也有事件监听模型。 在web网站开发中,被称为响应式编程。服务发现机制。以下并不是观察者模式的范畴,是一种更加宏观的机制,可能使用了观察者模式去发现。 javaSPI。服务提供者接口 在微服务中就是注册中心的发布订阅过程。发布者订阅者、提供者消费者。 在消息中间件中就是发布订阅模式。https://juejin.cn/post/6993999863159455752 意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 结构 参与者 Subject Subject 知道它的 Observer。可以有任意多个 O...
4.8 状态
意图 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 结构 参与者 Context 定义客户感兴趣的接口。 维护一个 ConcreteState 子类的实例,这个实例定义当前状态。 State 定义一个接口以封装与 Context 的一个特定状态相关的额行为。 ConcreteState 每一个子类实现一个与 Context 的一个状态相关的行为。 适用性 在以下情况下可以使用 State 模式: 一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为。 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。 效果 它将与特定状态相关的行为局部化。 它使得状态转换显式化。 State 对象可被共享。 相关模式 使用 Flyweight 模式共享状态对象。 使用 Singleton 模式实现状态对象。 Implementation糖果销售机有多种状态,每种状态下销售机有不同的行为,状态可以发生转移,使得销售机的行为也发生改变。 123456789...
4.9 策略
策略 Strategy别名 Policy 意图定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。使得算法可独立于使用它的客户而变化。 结构 参与者Strategy 定义所有支持的算法的公共接口。Context 使用这个接口来调用 ConcreteStrategy 定义的算法。 ConcreteStrategy 实现 Strategy 接口和具体算法。 Context 用一个 ConcreteStrategy 对象来配置。 维护一个对 Strategy 对象的引用。 可定义一个接口来让 Strategy 访问它的数据。 适用性在以下情况下可以使用 Strategy 模式: 许多相关的类仅仅是行为有异。Strategy 提供了一种用多个行为中的一个行为来配置一个类的方法。 需要使用一个算法的不同变体。 算法使用客户不应该知道的数据。 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关条件分支移入它们各自的 Strategy 类中以代替。 缺点 客户必须了解不同的 Strategy。要选择合适的 Str...
4.10 模板方法
意图 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 Template Method 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 结构 参与者 AbstractClass 定义抽象的原语操作(PrimitiveOperation),具体的子类将重定义它们以实现一个算法的各步骤。 实现一个模板方法,定义一个算法的骨架。该模板方法不仅调用原语操作,也调用定义在类中的其他操作。 ConcreteClass 实现原语操作以完成算法中与特定子类相关的步骤。 适用性 在以下情况下可以使用 Template Method 模式: 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。 控制子类扩展。只允许特定的点进行扩展。 效果 模板方法是一种代码复用的基本技术。 “好莱坞法则:Don’t call us, we’ll callyou.”,一个父类调用一个子类的操作,而不是相反。 相关模式 Factory Method 常被 Template Method...
4.11 访问者
访问者模式意图 表示一个作用于某对象结构中的各元素的操作。 Visitor 使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of theelements on which it operates. 结构 参与者 Visitor 为该对象结构中 ConcreteElement 的每一个类声明一个 Visit 操作。该操作的名字和特征标识了发送 Visit 请求给该访问者的那个类。 ConcreteVisitor 实现每个由 Visitor 声明的操作。 Element 定义一个 Accept 操作,它以一个 Visitor 为参数。 ConcreteElement 实现 Accept 操作,该操作以一个 Visitor 为参数。 ObjectStructur...
4.12 空对象
意图 通过对缺失对象的封装,以提供默认无任何行为的对象替代品。 Encapsulate the absence of an object by providing a substitutable alternativethat offers suitable default do nothing behavior. In short, a design where “nothing will come of nothing”. 结构 参与者 AbstractObject 声明协作对象的接口。 如果需要,可以实现默认行为。 RealObject 具体的协作对象类,提供有意义的行为。 NullObject 空对象类,继承自 AbstractObject,但接口实现不做任何事情。 Client 请求协作对象。 适用性 当以下情况成立时可以使用 Null Object 模式: 一个对象需要一个协作对象,但并无具体的协作对象。 协作对象不需要做任何事情。 效果 减少了对对象是否为 Null 的判断。 提供默认无任何具体行为的协作对象。 相关模式 因为...














