Java编程思想:一个小小的控制框架
这个实验我很喜欢,学到了非常多的东西:
import java.util.ArrayList; import java.util.List; public class Test { public static void main(String[] args) { GreenseController.test(); } } /* 需求: 要理解内部类时如果允许简单的创建过程,以及如何使用控制框架的,请考虑 这样一个控制框架,它的工作是在时间“就绪”的时候执行事件。虽然“就绪”状 态可以指任何事,但是在本例中是基于时间触发的事件。接下来的问题是,对于 要控制什么,控制框架并不包含任何具体的信息。那些信息是在实现算法的 action()部分时,通过继承来提供的。 案例分析: 控制框架分为三部分: 1.事件部分 2.控制部分 3.用户实现的控制部分 */ //事件部分 abstract class Event { private long eventTime; protected final long delayTime; public void start() { eventTime=System.nanoTime()+delayTime; } public boolean ready() { return System.nanoTime()>=eventTime; } public abstract void action(); public Event(long delayTime) { this.delayTime = delayTime; start(); } } //控制部分 class Controller { private List<Event> eventList = new ArrayList<>(); public void addEvent(Event c){eventList.add(c);} public void run() { /* 遍历时是针对复制版本的ArrayList进行遍历,删除时是删 除原来版本的ArrayList */ while (eventList.size() > 0) { for (Event e : new ArrayList<>(eventList)) { if(e.ready()){ System.out.println(e); e.action(); eventList.remove(e); } } } } } //用户实现的控制部分 class GreenhouseControls extends Controller { //灯的控制 private boolean light = false; public class LightOn extends Event{ public LightOn(long delayTime) { super(delayTime); } @Override public void action() { light=true; } public String toString() { return "Greenhouse light is on..."; } } public class LightOff extends Event { public LightOff(long delayTime) { super(delayTime); } @Override public void action() { light = false; } public String toString() { return "Greenhouse light is off..."; } } //水的控制 private boolean water = false; public class WaterOn extends Event{ public WaterOn(long delayTime) { super(delayTime); } @Override public void action() { water=true; } public String toString() { return "Greenhouse water is on..."; } } public class WaterOff extends Event { public WaterOff(long delayTime) { super(delayTime); } @Override public void action() { water = false; } public String toString() { return "Greenhouse water is Off..."; } } //恒温器的控制 private String thermostat = "day"; public class ThermostatNight extends Event{ public ThermostatNight(long delayTime) { super(delayTime); } @Override public void action() { thermostat = "night"; } public String toString(){ return "Greenhouse thermostat is night..."; } } public class ThermostatDay extends Event { public ThermostatDay(long delayTime) { super(delayTime); } @Override public void action() { thermostat = "day"; } public String toString(){ return "Greenhouse thermostat is day..."; } } //演示action()方法中,再创建一个匿名类 /* Bell逻辑: 一点添加了Bell事件,则Bell的action()方法被调用时 会在原始版本的EventList中添加一个Bell事件,也就是 说,除了手动的清除掉Bell事件,否则Bell事件将会永远 处于事件流中。 */ public class Bell extends Event{ public Bell(long delayTime) { super(delayTime); } /* 这个会造成循环事件添加吧?但会,因为run方法中 是对ArrayList进行了一个复制~ */ @Override public void action() { addEvent(new Bell(delayTime)); } public String toString() { return "Bing!"; } } /* Restart逻辑: Restart事件自己维护了一部分事件流,当Restart事件流被调用时 它首先将自己维护的那一部分事件流添加原始版本的eventList中, 然后重新设置下自己的触发事件,并将自己也放入到原始版本的 eventList流中。这就时说,Restart事件中的流,将会永永远远的 被执行,不会被抛弃 */ public class Restart extends Event { private Event[] eventList; public Restart(long delayTime,Event[] eventList) { super(delayTime); this.eventList = eventList; for (Event e : eventList) { addEvent(e); } } @Override public void action() { for (Event e : eventList) { addEvent(e); } start(); addEvent(this); } public String toString() { return "Restarting system."; } } public static class Terminate extends Event { public Terminate(long delayTime) { super(delayTime); } @Override public void action() { System.exit(0); } public String toString() { return "Terminating..."; } } } class GreenseController { public static void test() { GreenhouseControls gc = new GreenhouseControls(); gc.addEvent(gc.new Bell(900)); Event[] eventList = { gc.new ThermostatDay(0), gc.new LightOn(200), gc.new LightOff(400), gc.new WaterOn(600), gc.new WaterOff(800), gc.new ThermostatDay(1400), }; gc.addEvent(gc.new Restart(2000, eventList)); gc.addEvent(new GreenhouseControls.Terminate(800000000)); gc.run(); } }
Java编程思想:一个小小的控制框架的更多相关文章
- Java编程思想:进程控制
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public ...
- Java编程思想中关于闭包的一个例子
Java编程思想中的一个例子,不是很理解使用闭包的必要性,如果不使用闭包,是不是有些任务就不能完成?继续探索. package InnerClass; interface Incrementable ...
- Java编程思想 (1~10)
[注:此博客旨在从<Java编程思想>这本书的目录结构上来检验自己的Java基础知识,只为笔记之用] 第一章 对象导论 1.万物皆对象2.程序就是对象的集合3.每个对象都是由其它对象所构成 ...
- 《Java编程思想第四版》附录 B 对比 C++和 Java
<Java编程思想第四版完整中文高清版.pdf>-笔记 附录 B 对比 C++和 Java “作为一名 C++程序员,我们早已掌握了面向对象程序设计的基本概念,而且 Java 的语法无疑是 ...
- JAVA编程思想——分析阅读
需要源码.JDK1.6 .编码风格参考阿里java规约 7/12开始 有点意识到自己喜欢理论大而泛的模糊知识的学习,而不喜欢实践和细节的打磨,是因为粗心浮躁导致的么? cron表达式使用 设计能力.领 ...
- 《Java编程思想》读书笔记(五)
前言:本文是<Java编程思想>读书笔记系列的最后一章,本章的内容很多,需要细读慢慢去理解,文中的示例最好在自己电脑上多运行几次,相关示例完整代码放在码云上了,码云地址:https://g ...
- #Java编程思想笔记(一)——static
Java编程思想笔记(一)--static 看<Java编程思想>已经有一段时间了,一直以来都把笔记做在印象笔记上,今天开始写博客来记录. 第一篇笔记来写static关键字. static ...
- Java编程思想重点笔记(Java开发必看)
Java编程思想重点笔记(Java开发必看) Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...
- Java编程思想——初始化与清理
PS:最近一直忙于项目开发..所以一直没有写博客..趁着空闲期间来一发.. 学习内容: 1.初始化 2.清理 1.初始化 虽然自己的Java基础还是比较良好的..但是在解读编程思想的时候还是发现了 ...
随机推荐
- Advanced Installer 11.9基于IIS打包札记(For MySQL)
原文:Advanced Installer 11.9基于IIS打包札记(For MySQL) Mysql免安装前期部署 下载绿色命令行版本的mysql,将其放入到发布的程序发布包内,执行Update批 ...
- oracle延迟块清除
oracle在执行一些DML操作时,会在block上有活动事务的标志,如果一个事务commit后,由于某些block在commit之前已经写回datafile, 或者事务影响到的block数过多,则c ...
- Linux kernel version dirty
在我们使用git来管理Linux Kernel的时候,在编译的时候会在你的kernel version加上git commit number 有时候还会出现dirty字样,字面意思是内核被污染的意思. ...
- 为什么需要使用Git客户端?(使用msysgit)
Git 是 Linux Torvalds 为了帮助管理 Linux® 内核开发而开发的一个开放源码的版本控制软件.正如所提供的文档中说的一样,“Git 是一个快速.可扩展的分布式版本控制系统,它具有极 ...
- [转载] ASP.NET MVC (一)——深入理解ASP.NET MVC
个人认为写得比较透彻得Asp.net mvc 文章,所以转载过来,原文链接在最后: ASP.NET vs MVC vs WebForms 许多ASP.NET开发人员开始接触MVC认为MVC与ASP.N ...
- Delphi 7学习开发控件(继承TGraphicControl只画一条线)
我们知道使用Delphi快速开发,很大的一方面就是其强大的VCL控件,另外丰富的第三方控件也使得Delphi程序员更加快速的开发出所需要的程序.在此不特别介绍一些概念,只记录自己学习开发控件的步骤.假 ...
- uva10883_Supermean_数学
题目大意:给出n个数,每相邻两个数求平均数,得到n-1个数,再求平均数,得到n-2个数,......一直到最后一个数,输出这个数. 题目很简单,就是中间数据会比较大有点复杂,超过double的范围,而 ...
- uni-app $refs的基本用法
$refs的基本用法 一个对象(Object),持有注册过 ref 特性 的所有 DOM 元素和组件实例. <template> <view class="containe ...
- Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]解决
Laravel5.x运行迁移命令创建数据表:php artisan migrate报错. Illuminate\Database\QueryException : SQLSTATE[42000]: ...
- vuejs切换导航条高亮路由高亮做法
我的GitHub前端经验总结,喜欢的话请点star✨✨Thanks.:https://github.com/liangfengbo/frontend-develop vuejs导航条高亮我的做法: 用 ...