Singleton 和 Monostate 模式

Singleton 和 Monostate 模式

怎样才能使得两个实例表现得像一个对象呢?很简单,只要把所有的变量都变成静态变量即可。

public class Monostate {private static int itsX = 0;public Monostate() {}public void setX(final int x) {itsX = x;}public int getX() {return itsX;}
}

实现地铁十字转门的简单的有限状态机。十字转门开始时处于Locked 状态。如果投入一枚硬币,它就迁移到Unlocked 状态,开启转门,复位可能出现的任何告警状态,并把硬币放到收集箱柜中。如果此时乘客通过了转门,转门就迁移回Locked 状态并把门锁上。

 

实现类

public class Turnstile {/*** 是否已锁.*/private static boolean isLocked = true;/*** 是否报警中.*/private static boolean isAlarming = false;/*** 硬币数.*/private static int itsCoins = 0;/*** 退款数.*/private static int itsRefunds = 0;protected static final Turnstile LOCKED = new Locked();protected static final Turnstile UNLOCKED = new Unlocked();protected static Turnstile itsState = LOCKED;public void reset() {lock(true);alarm(false);itsCoins = 0;itsRefunds = 0;itsState = LOCKED;}public boolean locked() {return isLocked;}public boolean alarm() {return isAlarming;}/*** 投币.*/public void coin() {itsState.coin();}/*** 通过.*/public void pass() {itsState.pass();}/*** 设置锁住.* @param shouldLock*/protected void lock(boolean shouldLock) {isLocked = shouldLock;}/*** 设置报警.* @param shouldAlarm*/protected void alarm(boolean shouldAlarm) {isAlarming = shouldAlarm;}/*** 获取投币数.* @return*/public int coins() {return itsCoins;}/*** 获取退款数.* @return*/public int refunds() {return itsRefunds;}/*** 存钱.*/public void deposit() {itsCoins++;}/*** 退款.*/public void refund() {itsRefunds++;}static class Locked extends Turnstile {public void coin() {Turnstile.itsState = UNLOCKED;lock(false);alarm(false);deposit();}public void pass() {alarm(true);}}static class Unlocked extends Turnstile {public void coin() {refund();}public void pass() {lock(true);itsState = LOCKED;}}
}

测试类

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;public class TurnstileTest {@Beforepublic void before() {// 每次@Test前执行.Turnstile t = new Turnstile();t.reset();}@Testpublic void whenInit() {Turnstile t = new Turnstile();Assert.assertTrue(t.locked());}@Testpublic void whenCoin() {Turnstile t = new Turnstile();t.coin();Turnstile t1 = new Turnstile();Assert.assertTrue(!t1.locked());Assert.assertEquals(1, t1.coins());}@Testpublic void whenCoinAndPass() {Turnstile t = new Turnstile();t.coin();t.pass();Turnstile t1 = new Turnstile();Assert.assertTrue(t1.locked());Assert.assertTrue(!t1.alarm());Assert.assertEquals(1, t1.coins());}@Testpublic void whenTowCoins() {Turnstile t = new Turnstile();t.coin();t.coin();Turnstile t1 = new Turnstile();Assert.assertTrue(!t1.locked());Assert.assertEquals(1, t1.coins());Assert.assertEquals(1, t1.refunds());Assert.assertTrue(!t1.alarm());}@Testpublic void whenPass() {Turnstile t = new Turnstile();t.pass();Turnstile t1 = new Turnstile();Assert.assertTrue(t1.alarm());Assert.assertTrue(t1.locked());}@Testpublic void whenCancelAlarm() {Turnstile t = new Turnstile();t.pass();t.coin();Turnstile t1 = new Turnstile();Assert.assertTrue(!t1.alarm());Assert.assertTrue(!t1.locked());Assert.assertEquals(1, t1.coins());Assert.assertEquals(0, t1.refunds());}@Testpublic void whenTwoOperations() {Turnstile t = new Turnstile();t.coin();t.pass();t.coin();Assert.assertTrue(!t.locked());Assert.assertEquals(2, t.coins());t.pass();Assert.assertTrue(t.locked());}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497133.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

十张图看懂未来大数据世界

作者:薄云借智来源:钱塘江大数据随着互联网云时代的来临,大数据与云计算就像一个硬币的正反两面,势必会影响到社会生活的方方面面,改变我们现有的规则和秩序。伴随着大数据与云计算产业的不断发展,未来到底…

MediaWiki初探:安装及使用入门

来源:http://blog.csdn.net/wangnan537/article/details/37743497 MediaWiki是著名的开源wiki引擎,全球最大的wiki项目维基百科(百科词条协作系统)是使用MediaWiki的成功范例,MediaWiki的最大作用在于对知识的归档,可用于构建企业…

科学释梦——意识窗口在记忆模块间的穿越

作者:谢平 中国科学院大学教授 唐代诗人李白曾说,“浮生若梦,为欢几何”,将人生喻为短暂的梦幻。有些人生如梦,有些梦若人生,还有梦想人生......梦——五彩缤纷,诡异神奇,我们每晚都…

linux 内核与用户空间通信之netlink使用方法

Linux中的进程间通信机制源自于Unix平台上的进程通信机制。Unix的两大分支AT&T Unix和BSD Unix在进程通信实现机制上的各有所不同,前者形成了运行在单个计算机上的System V IPC,后者则实现了基于socket的进程间通信机制。同时Linux也遵循IEEE制定的P…

超级智能城市:更高质量的幸福社会

报告下载链接:https://pan.baidu.com/s/1oAmRK4U 密码:t9qb未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能,互联网和脑科学交叉研究机构。由互联网进化论作者,计算机博士刘锋与中国科学院虚拟经济与数据科学研究中心石勇、刘颖教授创建…

python网络编程——IO多路复用之epoll

来源:http://www.cnblogs.com/maociping/p/5132583.html 1、内核EPOLL模型讲解 此部分参考http://blog.csdn.net/mango_song/article/details/42643971博文并整理 首先我们来定义流的概念,一个流可以是文件,socket,pipe等可以进行…

高精度定位!“天地一体”基础设施助中国北斗在商用领域“弯道超车”

来源:上观概要:从2007年第一颗北斗导航卫星成功发射,到2018年2月12日第二十八、二十九颗卫星顺利升空进入预定轨道,北斗导航卫星系统的产业化步伐也日益加快。从2007年第一颗北斗导航卫星成功发射,到2018年2月12日第二…

2018全球技术展望报告

来源:199IT互联网数据中心概要:随着人工智能(AI)和其他技术的飞速发展,智能企业层出不穷,并正融入人们的生活。埃森哲(纽交所代码:ACN)最新发布的《埃森哲技术展望2018》…

Loguru:Python 日志终极解决方案

From:https://blog.csdn.net/kdl_csdn/article/details/121146354 1、日志的重要性 日志的作用非常重要,日志可以记录用户的操作、程序的异常,还可以为数据分析提供依据,日志的存在意义就是为了能够在程序在运行过程中记录错误&am…

全球机器换人排行榜!这八个国家遥遥领先

来源: 机器人创新生态概要:如今,世界各国都在进行机器换人,希望把人力劳动从低端工作岗位释放出来,制造业自动化水平越来越高,工厂利用工业机器人获得了更低的成本、更高的效率和更快的生产速度。人力成本的…

视频监控成AI芯片主战场,海康威视和大华股份占据半壁江山

来源:MEMS概要:图像和视频的人工智能处理,是目前AI芯片商业化前景最乐观的赛道,也是玩家们弯道超车的最佳机会。 图像和视频的人工智能处理,是目前AI芯片商业化前景最乐观的赛道,也是玩家们弯道超车的最佳机…

python 命令行 解析模块 optparse、argparse

optparse:https://docs.python.org/zh-cn/3/library/optparse.htmlargparse :https://docs.python.org/zh-cn/3/library/argparse.html3.2 版后已移除 optparse 模块,并且将不再继续开发;开发转至 argparse 模块进行。 ​1、argpa…

构建插件式的应用程序框架(六)----通讯机制(ZT)

前天发了构建插件式的应用程序框架(五)----管理插件这篇文章,有几个朋友在回复中希望了解插件之间是如何通讯的。这个系列的文章写到这里,也该谈谈这个问题了,毕竟已经有了插件管理。不知道大家…

人工智能产业2018年待解的三大难题

来源:人民邮电报概要:2017年,人工智能领域在算法、政策、资金等方面已经出现了三大突破,业界欢欣鼓舞的情形很像1999年年底网络泡沫泛滥时的情形。2017年,人工智能领域在算法、政策、资金等方面已经出现了三大突破&…

矩阵连乘问题(c++)

矩阵连乘问题 问题描述: 给定n个矩阵:A1,A2,…,An,其中Ai与Ai1是可乘的,i1,2…,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。输入数据为矩阵个数和每个矩…

QuestMobile 2017年中国移动互联网年度报告

来源:QuestMobile2017年,科技的风口兜兜转转,从直播、VR到AI再到区块链、短视频泛娱乐IP,最终在2017年底定格在了知识付费上,然而这并没有结束,紧随知识付费而来的就是撒币、大撒币……这就是中国移动互联网…

Python 读写配置文件模块: configobj 和 configParser

参考:http://www.voidspace.org.uk/python/configobj.html Python模块之ConfigParser - 读写配置文件:http://www.cnblogs.com/victorwu/p/5762931.html Python 官网 configparser 文档:https://docs.python.org/3.7/library/configparser.…

快速排序(c++)

1、快速排序的思想 快速排序就是给基准数据找在数组中正确位置的过程,一旦基准位置的正确位置找到,那基准位置左右两边经过同样的步骤递归也可以有序,最终整体数组有序。 整体可以理解为三个步骤: 1、先从队尾开始向前扫描且当l …

设计模式之禅--思维导图

原图ProcessOn里搜索:设计模式之禅

有BRT,为啥还建公交港湾

原来快速公交和普通公交要一块儿跑历山路公交港湾示意图(制图:赵国陆)   “历山路上既然跑快速公交车,有BRT站台,还要公交港湾干吗?”21日,本报报道了新公交港湾将在历山路亮相的消息后,不少市…