当前位置: 首页 > 编程日记 > 正文

Java中介者模式

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。

意图:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。

何时使用:多个类相互耦合,形成了网状结构。

如何解决:将上述网状结构分离为星型结构。

关键代码:对象 Colleague 之间的通信封装到一个类中单独处理。

应用实例: 1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。 2、机场调度系统。 3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。

缺点:中介者会庞大,变得复杂难以维护。

使用场景: 1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。 2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

注意事项:不应当在职责混乱的时候使用。

Memento.java

public class Memento { //创建Memento类
    private String state;
    
    public Memento(String state) {
        this.state = state;
    }
    
    public String getState() {
        return state;
    }
}

Originator.java

public class Originator { //创建Originator类
    private String state;
    
    public void setState(String state) {
        this.state = state;
    }
    
    public String getState() {
        return state;
    }
    
    public Memento saveStateToMemento() {
        return new Memento(state);
    }
    
    public void getStateFromMemento(Memento memento) {
        state = memento.getState();
    }
    
 }

CareTaker.java

import java.util.ArrayList;
import java.util.List;

public class CareTaker { //创建CareTaker类
    
    private List<Memento>mementoList = new ArrayList<Memento>();
    
    public void add(Memento state) {
        mementoList.add(state);
    }
    
    public Memento get(int index) {
        return mementoList.get(index);
    }
    
}

MementoPatternDemo.java

public class MementoPatternDemo {
    public static void main(String[] args) {
        Originator originator = new Originator();
        CareTaker careTaker   = new CareTaker();
        
        originator.setState("State #1");
        originator.setState("State #2");
        careTaker.add(originator.saveStateToMemento());
        
        originator.setState("State #3");
        careTaker.add(originator.saveStateToMemento());
        
        originator.setState("State #4");
        System.out.println("Current State: " + originator.getState());
        
        originator.getStateFromMemento(careTaker.get(0));
        System.out.println("First saved State: " + originator.getState());
        
        originator.getStateFromMemento(careTaker.get(1));
        System.out.println("Second saved State: " + originator.getState());
        
    }
}

相关文章:

那些打着AI万金油旗号的产品欺骗大众,如何识别?

作者 | Arvind Narayanan译者 | 刘畅出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;如今&#xff0c;很多打着AI名号售出的产品都属于万金油系列&#xff0c;没什么实质性的功能。为什么会这样&#xff1f;我们应该如何识别这类AI&#xff1f;幻灯片上是评估性格和工…

分享一款jQuery全屏滚动页面特性案例

分享一款jQuery全屏滚动页面特性案例。我们在来往官网&#xff0c;或者小米官网都会看到全屏滚动页面的一些例子。可以说全屏滚动页面越来越受欢迎。它们就像是竖着的图片轮转一样。这样的页面有很多&#xff0c;如&#xff1a;iPhone 5C页面&#xff1a;http://www.dowebok.co…

后深度学习时代的一大研究热点?论因果关系及其构建思路

作者 | Bernhard Schlkopf译者 | Kolen编辑 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;尽管机器学习在现阶段取得了很大成功&#xff0c;但是相比于动物所能完成的工作&#xff0c;机器学习在动物擅长的关键技术上表现不尽人意&#xff0c;比如…

Java观察者模式

当对象间存在一对多关系时&#xff0c;则使用观察者模式&#xff08;Observer Pattern&#xff09;。比如&#xff0c;当一个对象被修改时&#xff0c;则会自动通知它的依赖对象。观察者模式属于行为型模式。 意图&#xff1a;定义对象间的一种一对多的依赖关系&#xff0c;当一…

Python3中None用法

1.None是一个空值&#xff0c;空值是Python里的一个特殊值&#xff0c;用None表示。可以将None赋值给任何变量。 var None; print(var) # None if var is None:print("var has a value of None") # print else:print("var:", var) 2.None有自己的数据类型…

try finally 中的return

2019独角兽企业重金招聘Python工程师标准>>> public class Test { public static int test1() { int x 1; try { return x; } finally { x; } } public static int test2() { int x 1; try { return x; } finally { return x; } } public st…

我用Python破解了同事的加密压缩包

作者 | 朱小五来源 | 凹凸玩数据&#xff08;ID: alltodata&#xff09;又是一杯奶茶。事情的经过是这样的&#xff1a;又是奶茶&#xff0c;行吧行吧。快点开工&#xff0c;争取李大伟回来之前搞定。李大伟说是6位数字密码那么我们可以利用python生成全部的六位数字密码#生成从…

Ubuntu上通过android toolchain交叉编译Valgrind操作步骤

关于Valgrind的介绍可以参考&#xff1a;https://blog.csdn.net/fengbingchun/article/details/50196189. 这里介绍下在Ubuntu 16.04上通过android toolchain如android-ndk-r14b交叉编译Valgrind源码的操作步骤&#xff1a; 1. 从 https://valgrind.org/ 下载最新的版本3.17.0&…

Java状态模式

在状态模式&#xff08;State Pattern&#xff09;中&#xff0c;类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中&#xff0c;我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。 意图&#xff1a;允许对象在内部…

Red Hat 5.8 CentOS 6.5 共用 输入法

pick up from http://jingyan.baidu.com/article/20b68a885a3607796cec622c.html

Python3中with用法

Python中的with语句用于用上下文管理器(context manager)定义的方法包装块的执行&#xff0c;它允许将常见的try…except…finally使用模式封装起来以方便重用。 在Python中&#xff0c;在处理非托管资源(unmanaged resources)(如文件流)时使用with关键字。它允许确保你在使用资…

作为计算机专业的你,这些点你命中了哪些?

是不是学计算机的在别人眼里就得会修电脑&#xff1f;是不是编代码的程序员在别人眼里就得喜欢穿格子衫&#xff1f;是不是从事互联网行业的人在别人眼里就喜欢背双肩包出行&#xff1f;1我学计算机就得会修电脑&#xff1f;前两天我在加班的时候&#xff0c;电话突然响起&…

Java空对象模式

在空对象模式&#xff08;Null Object Pattern&#xff09;中&#xff0c;一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值&#xff0c;而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。 在空对象模式中&#xff0c;我们…

JSON入门基础知识

2019独角兽企业重金招聘Python工程师标准>>> JSON入门基础 1、JSON定义 JSON&#xff1a;JavaScript 对象表示法&#xff08;JavaScript Object Notation&#xff09;。 JSON 是存储和交换文本信息的语法。类似 XML。 JSON 比 XML 更小、更快&#xff0c;更易…

Python3中raise用法

Python中raise语句支持强制触发指定的异常。 raise语法&#xff1a; raise [EXPRESSION [from EXPRESSION]] 如果raise后未跟表达式(expression)&#xff0c;则raise重新引发当前作用域中活动的最后一个异常。如果当前范围内没有异常处于活动状态&#xff0c;则会引发RuntimeE…

精选实践 | 爱奇艺实用数据库选型树:不同场景如何快速选择数据库?

作者 | 郭磊涛 爱奇艺数据库和中间件负责人 TiDB User Group Ambassador来源 | 授权转载自AskTUG本文系 TUG 线下活动 “不同业务场景下的数据库技术选型思路” 分享实录。我是爱奇艺的数据库和中间件负责人郭磊涛&#xff0c;今天主要向大家分享数据库选型方面的思路&#xff…

iOS处理高并发量的数据请求和数据集合的对应关系

一、处理高并发请求的核心代码如下&#xff1a; // 创建信号量dispatch_semaphore_t semaphore dispatch_semaphore_create(0);// 创建全局并行dispatch_queue_t queue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);dispatch_group_t group dispatch_gro…

Top 10 Mistakes Java Developers Make(转)

文章列出了Java开发者最常犯的是个错误。 1.将数组转换为ArrayList 为了将数组转换为ArrayList&#xff0c;开发者经常会这样做&#xff1a; ?1List<String> list Arrays.asList(arr);Arrays.asList()会返回一个ArrayList&#xff0c;但这个ArrayList是Arrays的私有静态…

Python3中迭代器介绍

Python中一个可迭代对象(iterable object)是一个实现了__iter__方法的对象&#xff0c;它应该返回一个迭代器对象(iterator object)。迭代器是一个实现__next__方法的对象&#xff0c;它应该返回它的可迭代对象的下一个元素&#xff0c;并在没有可用元素时触发StopIteration异常…

30+博士、100+硕士整理的超全深度强化学习资源清单

作者 | Deep-RL来源 | 深度强化学习实验室&#xff08;ID&#xff1a;Deep-RL&#xff09;今天为大家推荐一个开源、开发的 Github 好项目《A Guide for Deep Reinforcement Learning》。这个项目联合了Deep Reinforcement Learning领域的30位博士&#xff0c;100位硕士共同完成…

Java访问者模式

在访问者模式&#xff08;Visitor Pattern&#xff09;中&#xff0c;我们使用了一个访问者类&#xff0c;它改变了元素类的执行算法。通过这种方式&#xff0c;元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式&#xff0c;元素对象已接受…

GNU/Linux平台上正则表达式的简单使用

友情提醒&#xff1a;本博文涉及的内容中涉及到的系统实践操作在Centos6.5上实现,GNU/Linux简称为linux&#xff0c;GNU/grep简称为grep&#xff0c;GNU/sed简称为sed&#xff0c;GNU/gawk简称为awk。-------------------------------------------------楔子------------------…

Linux下addr2line命令用法

Linux下addr2line命令用于将程序指令地址转换为所对应的函数名、以及函数所在的源文件名和行号。当含有调试信息(-g)的执行程序出现crash时(core dumped)&#xff0c;可使用addr2line命令快速定位出错的位置。 如果无法确定文件名或函数名&#xff0c;addr2line将在它们的位置打…

JavaMVC 模式

MVC 模式代表 Model-View-Controller&#xff08;模型-视图-控制器&#xff09; 模式。这种模式用于应用程序的分层开发。 Model&#xff08;模型&#xff09; - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑&#xff0c;在数据变化时更新控制器。View&#xff0…

从概念到技术,打通「中台」的任督二脉,别再说不知道中台是什么

2019 年&#xff0c;「中台」这个词火了&#xff01;随着阿里等头部互联网企业搭建和推动中台业务&#xff0c;让越来越多的企业关注中台&#xff0c;纷纷提出「中台战略」&#xff0c;帮助企业自身加速实现数字化转型。不少企业还在观望「中台」&#xff1a;1、我的企业里需要…

php中序列化与反序列化

http://www.cnblogs.com/A-Song/archive/2011/12/13/2285619.html 转自&#xff1a;http://qing.weibo.com/tag/unserialize 把复杂的数据类型压缩到一个字符串中 serialize() 把变量和它们的值编码成文本形式unserialize() 恢复原先变量eg:$stooges array(Moe,Larry,Curly);$…

Python3中生成器介绍

生成器(generator)&#xff1a;一个返回生成器迭代器的函数。它看起来像一个普通函数&#xff0c;除了它包含用于生成一系列可在for循环中使用的值的yield表达式或者可以使用next函数一次检索一个值。 在Python中&#xff0c;使用了yield的函数被称为生成器。跟普通函数不同的是…

数学学渣必备!拍照上传,分步求解,微软解题神器拯救你

整理 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;在学好数学这条路上&#xff0c;很多同志前赴后继「死伤无数」&#xff0c;即便大家不断的寻求「场外救援」&#xff0c;可最终都逃不过一个字&#xff1a;难&#xff01;两个字&#xff1a;真难…

Java业务代表模式

业务代表模式&#xff08;Business Delegate Pattern&#xff09;用于对表示层和业务层解耦。它基本上是用来减少通信或对表示层代码中的业务层代码的远程查询功能。在业务层中我们有以下实体。 客户端&#xff08;Client&#xff09; - 表示层代码可以是 JSP、servlet 或 UI j…

在wamp环境下面安装Zend Optimizer的方法

我是用WAMP来做PHP的服务器&#xff0c;进行本机测试和开发PHP项目。 wamp环境是刚刚安装的。由于这个项目的代码是zend加密的&#xff0c;运行时候都是乱码&#xff0c;需要安装一个Zend Optimizer配置。 首先下载一个Zend Optimizer软件。 1、进入安装界面后&#xff0c;按NE…