java设计模式9.备忘录模式、访问者模式、调停者模式

  • 备忘录模式

备忘录模式又叫快照模式,备忘录对象是一个用来存储另外一个对象内部状态快照的对象。备忘录的用意是在不破坏封装的条件下,将一个对象的状态捕捉,并外部化存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态,备忘录模式常与命令模式和迭代子模式一起使用。

  • 访问者模式

访问者的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。访问者模式使适用于数据结构相对未定的系统,它把数据结构和作用于结构之上的操作解耦。

  • 抽象访问者角色Visitor:声明一个或多个访问操作,形成所有的具体元素角色必须实现的接口。
  • 具体访问者角色ConcreteVisitor:实现抽象访问者角色所声明的接口。
  • 抽象节点角色Node:声明一个接受操作,接受一个访问者对象作为一个参量。
  • 具体节点角色Node:实现抽象元素所规定的接受操作。
  • 结构对象角色ObjectStructrue:能够遍历结构中所有元素,如果需要,提供一个高层次的接口让接口访问者可以访问每一个元素,可以设计成一个符合对象或者一个聚集。
public abstract class Node {

    public abstract void accept(Visitor visitor);
}

public class NodeA  extends Node{

    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

    public void operationA(){
        System.out.println("A");
    }
}

public class NodeB extends Node{

    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

    public void operationB(){
        System.out.println("B");
    }
}
public interface Visitor {

    void visit(NodeA node);

    void visit(NodeB node);
}

public class VisitorA implements Visitor{

    @Override
    public void visit(NodeA node) {
        node.operationA();
    }

    @Override
    public void visit(NodeB node) {
        node.operationB();
    }
}

public class VisitorB implements Visitor{

    @Override
    public void visit(NodeA node) {
        node.operationA();
    }

    @Override
    public void visit(NodeB node) {
        node.operationB();
    }
}
public class ObjectStructure {

    private List<Node> nodes;

    public ObjectStructure(){
        nodes = new ArrayList<Node>();
    }

    public void action(Visitor visitor){
        for(Node node : nodes){
            node.accept(visitor);
        }
    }

    public void add(Node node){
        nodes.add(node);
    }
}
public class Client {

    public static void main(String[] args) {
        ObjectStructure structs = new ObjectStructure();
        structs.add(new NodeA());
        structs.add(new NodeB());

        Visitor visitor = new VisitorA();
        structs.action(visitor);
    }
}
  • 调停者模式

调停者模式包装了一系列对象相互作用的方式,使得这些对象不必互相明显引用。从而使它们可以较松散地耦合,当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的一些对象之间的相互作用。从而保证这些相互作用可以彼此独立地变化。

在调停者模式中,所有的成员对象都可以协调工作,但又不直接相互管理。这些对象都与一个处于中心地位的调停者对象发生紧密的关系,由这个调停者对象进行协调工作。这个协调者对象叫做调停者,而调停者所协调的成员对象称作同事对象。

#笔记内容参考《java与模式》

原文地址:https://www.cnblogs.com/shanhm1991/p/9898680.html

时间: 2025-01-13 14:42:17

java设计模式9.备忘录模式、访问者模式、调停者模式的相关文章

Java设计模式(十一)访问者模式 中介者模式

(二十一)访问者模式 对已存在的类进行扩展,通常需要增加方法,但是如果需要的行为与现有的对象模型不一致,或者无法修改现有代码.在这种情况下,不更改类的层次结构,就无法扩展该层次结构的行为.如果运用了访问者模式,就可以支持开发人员扩展该类层次结构的行为. 和解释器模式一样,访问者模式通常是基于合成模式的. 访问者模式在不改变类层次结构的前提下,对该层次结构进行扩展. interface Visitor{ public void visit(VisiSubject sub); } interface

折腾Java设计模式之备忘录模式

原文地址:折腾Java设计模式之备忘录模式 备忘录模式 Without violating encapsulation, capture and externalize an object's internal state allowing the object to be restored to this state later. 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态. 所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个

设计模式的征途—16.访问者(Visitor)模式

在患者就医时,医生会根据病情开具处方单,很多医院都会存在以下这个流程:划价人员拿到处方单之后根据药品名称和数量计算总价,而药房工作人员根据药品名称和数量准备药品,如下图所示. 在软件开发中,有时候也需要处理像处方单这样的集合对象结构,在该对象结构中存储了多个不同类型的对象信息,而且对同一对象结构中的元素的操作方式并不唯一,可能需要提供多种不同的处理方式.在设计模式中,有一种模式可以满足上述要求,其模式动机就是以不同的方式操作复杂对象结构,该模式就是访问者模式. 访问者模式(Visitor) 学习

JAVA设计模式(01):创建型-工厂模式【工厂方法模式】(Factory Method)

简单工厂模式尽管简单,但存在一个非常严重的问题.当系统中须要引入新产品时,因为静态工厂方法通过所传入參数的不同来创建不同的产品,这必然要改动工厂类的源码,将违背"开闭原则".怎样实现添加新产品而不影响已有代码?工厂方法模式应运而生,本文将介绍另外一种工厂模式--工厂方法模式. 1 日志记录器的设计 Sunny软件公司欲开发一个系统执行日志记录器(Logger).该记录器能够通过多种途径保存系统的执行日志,如通过文件记录或数据库记录,用户能够通过改动配置文件灵活地更换日志记录方式. 在设

《JAVA与模式》之调停者模式

调停者模式是对象的行为模式.调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用.从而使它们可以较松散地耦合.当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的一些对象之间的相互作用.从而保证这些相互作用可以彼此独立地变化. 为什么需要调停者 如下图所示,这个示意图中有大量的对象,这些对象既会影响别的对象,又会被别的对象所影响,因此常常叫做同事(Colleague)对象.这些同事对象通过彼此的相互作用形成系统的行为.从图中可以看出,几乎每一个对象都需要与其他的

JAVA设计模式(17):行为型-模板方法模式(Template Method)

场景 客户到银行办理业务: 取号排队 办理具体现金/转账/企业/个人/理财业务 给银行工作人员评分 核心: 处理某个流程的代码已经都具备,但是其中某个节点的代码暂时不能确定.因此,我们采用工厂方法模式,,将这个节点的代码实现转移给子类完成. 即:处理步骤父类中定义好,具体实现延迟到子类中定义. 概述 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑

JAVA设计模式之 备忘录模式【Memento Pattern】

一.概述 在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以在以后将对象恢复至原先保存的状态.它是一种对象行为型模式. 二.适用场景 1.类似于撤销功能的实现,保存一个对象在某一时间的部分状态或全部状态,当以后需要它时就可以恢复至先前的状态. 2. 对对象历史状态的封装.避免将对象的历史状态的实现细节暴露给外界. 三.UML类图 四.参与者 1.Originator(原发器):它是一个普通类,可以创建一个备忘录,并存储它的当前内部状态,也可以使用备忘录来恢复其内

Java设计模式之备忘录模式

本文继续23种设计模式系列之备忘录模式. 我们在编程的时候,经常需要保存对象的中间状态,当需要的时候,可以恢复到这个状态.比如,我们使用Eclipse进行编程时,假如编写失误(例如不小心误删除了几行代码),我们希望返回删除前的状态,便可以使用Ctrl+Z来进行返回.下象棋的时候,可以反悔.这时我们便可以使用备忘录模式来实现. 定义 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样就可以将该对象恢复到原先保存的状态 角色 发起人:记录当前时刻的内部状态,负责定义哪些

Java设计模式应用——备忘录模式

备忘录模式主要用于存档.游戏中我们打boss前总会存档,如果打boss失败,则读取存档,重新挑战boss. 可以看出来,备忘录模式一般包括如下数据结构 1. 存档文件:用于恢复备份场景的必要数据: 2. 存档管理器:用于管理存档,包括存档的读写与展示: 3. 被存档的对象. 下面以射击游戏的存档来举例: 1. 射击选手 package com.coshaho.learn.memorandum; // 射击手 public class Shooter { // 血量 private int blo