这个实验我很喜欢,学到了非常多的东西:

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编程思想:一个小小的控制框架的更多相关文章

  1. Java编程思想:进程控制

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public ...

  2. Java编程思想中关于闭包的一个例子

    Java编程思想中的一个例子,不是很理解使用闭包的必要性,如果不使用闭包,是不是有些任务就不能完成?继续探索. package InnerClass; interface Incrementable ...

  3. Java编程思想 (1~10)

    [注:此博客旨在从<Java编程思想>这本书的目录结构上来检验自己的Java基础知识,只为笔记之用] 第一章 对象导论 1.万物皆对象2.程序就是对象的集合3.每个对象都是由其它对象所构成 ...

  4. 《Java编程思想第四版》附录 B 对比 C++和 Java

    <Java编程思想第四版完整中文高清版.pdf>-笔记 附录 B 对比 C++和 Java “作为一名 C++程序员,我们早已掌握了面向对象程序设计的基本概念,而且 Java 的语法无疑是 ...

  5. JAVA编程思想——分析阅读

    需要源码.JDK1.6 .编码风格参考阿里java规约 7/12开始 有点意识到自己喜欢理论大而泛的模糊知识的学习,而不喜欢实践和细节的打磨,是因为粗心浮躁导致的么? cron表达式使用 设计能力.领 ...

  6. 《Java编程思想》读书笔记(五)

    前言:本文是<Java编程思想>读书笔记系列的最后一章,本章的内容很多,需要细读慢慢去理解,文中的示例最好在自己电脑上多运行几次,相关示例完整代码放在码云上了,码云地址:https://g ...

  7. #Java编程思想笔记(一)——static

    Java编程思想笔记(一)--static 看<Java编程思想>已经有一段时间了,一直以来都把笔记做在印象笔记上,今天开始写博客来记录. 第一篇笔记来写static关键字. static ...

  8. Java编程思想重点笔记(Java开发必看)

    Java编程思想重点笔记(Java开发必看)   Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...

  9. Java编程思想——初始化与清理

    PS:最近一直忙于项目开发..所以一直没有写博客..趁着空闲期间来一发.. 学习内容: 1.初始化 2.清理 1.初始化   虽然自己的Java基础还是比较良好的..但是在解读编程思想的时候还是发现了 ...

随机推荐

  1. Android手机导出文件

    因为要写联系人相关的东西,所以得把db导出来看看 第一步:Root手机 尝试了几个Root工具,发现就KingRoot能root 第二个:编写bat脚本 脚本内容是先将DB文件从/data/data ...

  2. 零元学Expression Blend 4 - Chapter 27 PathlistBox被Selected时的蓝底蓝框问题

    原文:零元学Expression Blend 4 - Chapter 27 PathlistBox被Selected时的蓝底蓝框问题 最近收到网友Cloud的来信,询问我有关放进PathlistBox ...

  3. Redis 高可用之哨兵模式

    参考   : https://mp.weixin.qq.com/s/Z-PyNgiqYrm0ZYg0r6MVeQ 一.redis高可用解决方案 redis主从 优点:1.高可靠性,主从实时备份,有效解 ...

  4. 插件化二(Android)

    插件化二(Android) 上一篇文章<插件化一(android)>里大概构思了下插件加载与校验的流程和一些大体设计,这次就具体展开,在<动态加载与插件化>里提到以apk形式开 ...

  5. <iOS小技巧> 昵称格式判断

    一.使用方式 + 如下代码块功能:判断字体,判断字体输入格式       NSString *firstStr = [name substringToIndex:1];    NSArray *num ...

  6. Dedecms 中,获取某一栏目所有子栏目

    以前从来没写过递归(其实想想,对算法完全没概念),刚好有这个需求,试着写了一下,发现也挺容易的,特别记录一下. 数据库是dedecms默认的,dede_arctype是保存栏目的表,reid是栏目的父 ...

  7. 阿里云CDN+OSS完成图片加速

    我们使用React Native开发APP,在列表中显示图片时,列表框经常出现长时间的空白.经过稍微研究和参考其他人的经验,我们知道React Native的ListView以及后来改进版的FlatL ...

  8. Spring源码解读之BeanFactoryPostProcessor的处理

    前言 前段时间旁听了某课堂两节Spring源码解析课,刚好最近自己又在重新学习中,便在这里记录一下学习所得.我之前写过一篇博文,是介绍BeanFactoryPostProcessor跟BeanPost ...

  9. Python|网页转PDF,PDF转图片爬取校园课表~

    import pdfkit import requests from bs4 import BeautifulSoup from PIL import Image from pdf2image imp ...

  10. Python自学day-6

    一.编程范式       编程:程序员用特定的语法.数据结构和算法告诉计算机如何执行任务的过程.实现任务有很多不同的方式,根据编程方式的特点进行归纳总结出来的编程方式类别,就叫编程范式.大多数语言只支 ...