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基础还是比较良好的..但是在解读编程思想的时候还是发现了 ...
随机推荐
- vs调试cordova app时 scriptedsandbox64.exe已停止工作的错误处理方法
1.把ie更新到版本11 2.去掉 选项->调试->调试时启动诊断工具 有时候调试会启动失败,提示版本过低,再一次点击调试就可以了.
- Win10《芒果TV》更新v3.5.0夏至版:会员尊享蓝光画质,关联本地视频播放
在Win10秋季创意者更新前夕,Win10版<芒果TV>全平台同步更新夏至版v3.5.0,新增会员蓝光画质,关联本地视频播放,进一步提升使用体验. Win10版<芒果TV>V3 ...
- Mongodb Compile C++ Driver
之前发现直接编译mongo源码中的驱动,静态库的驱动会很大,在链接使用的时候会报很多链接错误. 转而直接编译单独提供驱动源码,同样vc2008的版本也要做我的另一篇博文中修改,在这不多说,具体参见: ...
- 静态编译 Qt 5.6
源码下载 Qt git地址:git://code.qt.io/qt/qt5.git 推荐用 SourceTree 客户端来克隆源码 准备工作 系统 Windows 7 或者 Windows 10 编译 ...
- Spring Boot:整合Swagger文档
综合概述 spring-boot作为当前最为流行的Java web开发脚手架,越来越多的开发者选择用其来构建企业级的RESTFul API接口.这些接口不但会服务于传统的web端(b/s),也会服务于 ...
- Fabric1.4源码解析:客户端创建通道过程
在使用Fabric创建通道的时候,通常我们执行一条命令完成,这篇文章就解析一下执行这条命令后Fabric源码中执行的流程. peer channel create -o orderer.example ...
- 高并发IM系统架构优化实践
互联网+时代,消息量级的大幅上升,消息形式的多元化,给即时通讯云服务平台带来了非常大的挑战.高并发的IM系统背后究竟有着什么样的架构和特性? 以上内容由网易云信首席架构师内部分享材料整理而成 相关阅读 ...
- linux下用户权限划分
场景: 建立一个目录为/devcode,该目录是给开发组用的,也就是只有开发组用户才能进行操作该目录.该组下有成员zhangsan,lisi 步骤: 1.创建用户组,命名dev groupadd d ...
- java里字节与字符的区别
当时学Java的时候没搞懂字节和字符的区别,今天看文件输入输出流的时候觉得是时候彻底把这两个概念弄懂. 首先得知道byte的概念和作用: byte即字节的意思,是java中的基本数据类型,用来申明字节 ...
- hdoj2037 贪心算法——今年暑假不AC
所谓“贪心算法”是指:在对问题求解时,总是作出在当前看来是最好的选择.也就是说,不从整体上加以考虑,它所作出的仅仅是在某种意义上的局部最优解(是否是全局最优,需要证明). 经典问题:时间序列问题 ...