java内部类与控制框架

飞龙dragon      2022-04-24     148

关键词:

应用程序控制框架(application framework)就是设计解决某类特殊问题的一个类,或一组类,要运用某个应用程序框架,通常是继承一个类或多个类,并覆盖这些方法.在覆盖的方法中编写代码定制应用程序框架提供的解决方案,以解决你的问题

控制框架是一类特殊应用程序框架,它用来解决响应事件的需求,主要用来响应事件的系统被称为事件驱动系统,(最常见的是GUI)

应用框架设计中,设计的关键是"变化的事物和不变的事物相互分离"

 

//: innerclasses/controller/Event.java
// The common methods for any control event.
package object;

public abstract class Event {//因为其默认的行为是基于时间去执行控制的,所以使用抽象类代替实际的接口
  private long eventTime;
  protected final long delayTime;
  public Event(long delayTime) {
    this.delayTime = delayTime;
    start();
  }
  public void start() { // Allows restarting//当运行Event并调用start()时,构造器就会捕获时间
    eventTime = System.nanoTime() + delayTime;//当前时间加上延迟时间,start()是一个独立方法,而没有包含在构造器中
  }                                           //这样就可以在事件运行以后重新启动计时器
  public boolean ready() {
    return System.nanoTime() >= eventTime;
  }
  public abstract void action();//对于控制行为,控制框架并不包含具体的信息,那些算的action()部分通过继承action()来来提供
} ///:~

下面的是一个用来管理并触发事件的实际控制框架,

//: innerclasses/controller/Controller.java
// The reusable framework for control systems.
package object;
import java.util.*;

public class Controller {
  // A class from java.util to hold Event objects:
    //List是一个容器,list<Event>(读作Event的列表> 
    //add()添加Object到LIst的尾端, size()得到List中的元素个数
    //foreach语法用来连续获取List中的Event
    //remove()方法用来从list列表移除指定的Event
  private List<Event> eventList = new ArrayList<Event>();
  public void addEvent(Event c) { eventList.add(c); }
  public void run() {  //该方法遍历eventlist,寻找就绪的ready(),并调用相应的方法
    while(eventList.size() > 0)
      // Make a copy so you‘re not modifying the list
      // while you‘re selecting the elements in it:
      for(Event e : new ArrayList<Event>(eventList))
        if(e.ready()) {
          System.out.println(e);
          e.action();
          eventList.remove(e);
        }
  }
} ///:~

内部类允许:

1)控制框架的完整是由单个的类创建的,从而使得实现的细节被封装了起来,内部类用来表示解决问题所必需的各种不同的action()

2)内部类能够很容易地访问外围类的任意成员,所以可以避免这种实现变得笨拙,

下面是此框架的一个特定实现,控制温度的运作:控制灯光,水,温度调节器的开关,以及响铃和重新启动系统,每个行为都是完全不同的,控制框架的设计使得分离这些不同的代码变得非常容易,使用内部类,可以在单一的类里面产生对同一个基类Event的多种导出版本,对于温度系统的每一种行为,都继承一个新的Event内部类,并在要实现的action()中编写控制代码

//: innerclasses/GreenhouseControls.java
// This produces a specific application of the
// control system, all in a single class. Inner
// classes allow you to encapsulate different
// functionality for each type of event.
package object;

public class GreenhouseControls extends Controller {
  private boolean light = false;
  public class LightOn extends Event {
    public LightOn(long delayTime) { super(delayTime); }
    public void action() {
      // Put hardware control code here to
      // physically turn on the light.
      light = true;
    }
    public String toString() { return "Light is on"; }
  }    
  public class LightOff extends Event {
    public LightOff(long delayTime) { super(delayTime); }
    public void action() {
      // Put hardware control code here to
      // physically turn off the light.
      light = false;
    }
    public String toString() { return "Light is off"; }
  }
  private boolean water = false;
  public class WaterOn extends Event {
    public WaterOn(long delayTime) { super(delayTime); }
    public void action() {
      // Put hardware control code here.
      water = true;
    }
    public String toString() {
      return "Greenhouse water is on";
    }
  }    
  public class WaterOff extends Event {
    public WaterOff(long delayTime) { super(delayTime); }
    public void action() {
      // Put hardware control code here.
      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);
    }
    public void action() {
      // Put hardware control code here.
      thermostat = "Night";
    }
    public String toString() {
      return "Thermostat on night setting";
    }
  }    
  public class ThermostatDay extends Event {
    public ThermostatDay(long delayTime) {
      super(delayTime);
    }
    public void action() {
      // Put hardware control code here.
      thermostat = "Day";
    }
    public String toString() {
      return "Thermostat on day setting";
    }
  }
  // An example of an action() that inserts a
  // new one of itself into the event list:
  public class Bell extends Event {
    public Bell(long delayTime) { super(delayTime); }
    public void action() {
      addEvent(new Bell(delayTime));//Bell控制响铃然后再事件列表中增加一个Bell对象,于是过一会二它可以再次响铃
    }
    public String toString() { return "Bing!"; }
  }    
  public class Restart extends Event {//Restart()可以控制系统有规律的重启
    private Event[] eventList;
    public Restart(long delayTime, Event[] eventList) {
      super(delayTime);
      this.eventList = eventList;
      for(Event e : eventList)
        addEvent(e);
    }
    public void action() {
      for(Event e : eventList) {
        e.start(); // Rerun each event
        addEvent(e);
      }
      start(); // Rerun this Event
      addEvent(this);
    }
    public String toString() {
      return "Restarting system";
    }
  }    
  public static class Terminate extends Event {
    public Terminate(long delayTime) { super(delayTime); }
    public void action() { System.exit(0); }
    public String toString() { return "Terminating";  }
  }
} ///:~

下面的类通过创建一个GreenhouseControls对象,并添加各种不同的Event对象来配置该系统,这是命令设计模式的一个例子再eventlist中的每一个被封装成对象的请求

//: innerclasses/GreenhouseController.java
// Configure and execute the greenhouse system.
// {Args: 5000}
package object;
public class GreenhouseController {
  public static void main(String[] args) {
    GreenhouseControls gc = new GreenhouseControls();
    // Instead of hard-wiring, you could parse
    // configuration information from a text file here:
    gc.addEvent(gc.new Bell(900));
    Event[] eventList = {
      gc.new ThermostatNight(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));
    if(args.length == 1)
      gc.addEvent(
        new GreenhouseControls.Terminate(
          new Integer(args[0])));

    
    gc.run();
  }
} /* Output:
Bing!
Thermostat on night setting
Light is on
Light is off
Greenhouse water is on
Greenhouse water is off
Thermostat on day setting
Restarting system
Terminating
*///:~

 

java内部类与异常类

内部类定义在类A中声明了类B,B称为内部类,A称为B的外嵌类应用需要建立一个类,不想它为外界所用publicclassRedCowform{staticStringformName="红牛农场";Redcowcow;// 声明publicRedCowform(){cow=newRedCow();}classRedCow{StringName;intheigh... 查看详情

java的内部类与匿名内部类

参考技术A  publicinterfaceContents  intvalue();    publicinterfaceDestination  StringreadLabel();    publicclassGoods  privateclassContentimplementsContents  privateinti=;  publicintvalue()  returni;      protectedclassGDestinationimplement... 查看详情

java内部类与final关键字详解

阅读目录一、内部类的几种创建方法:二、神马是内部类?三、最后来说说final关键字:回到顶部一、内部类的几种创建方法:1、成员内部类123456classOuterprivateinti=1;     classInner       &n... 查看详情

非静态内部类与静态内部类(代码片段)

文章目录非静态内部类与静态内部类内部类是什么内部类解析JDK8JDK11加载的顺序的验证执行:宿主类内静态变量被调用执行:非静态内部类的静态变量被调用执行:静态内部类中的变量被调用时非静态内部类与静态内... 查看详情

“全栈2019”java第一百零七章:匿名内部类与构造方法注意事项

...DEAv2018.3文章原文链接“全栈2019”Java第一百零七章:匿名内部类与构造方法注意事项下一章“全栈2019”Java第一百零八章:匿名内部类与final关键字学习小组加入同步学习小组,共同交流与进步。方式一:关注头条号Gorhaf,私信... 查看详情

“全栈2019”java第一百零六章:匿名内部类与抽象类接口注意事项

...DEAv2018.3文章原文链接“全栈2019”Java第一百零六章:匿名内部类与抽象类接口注意事项下一章“全栈2019”Java第一百零七章:匿名内部类与构造方法注意事项学习小组加入同步学习小组,共同交流与进步。方式一:关注头条号Gorh... 查看详情

“全栈2019”java第八十三章:内部类与接口详解

...IntelliJIDEAv2018.3文章原文链接“全栈2019”Java第八十三章:内部类与接口详解下一章“全栈2019”Java第八十四章:接口中嵌套接口详解学习小组加入同步学习小组,共同交流与进步。方式一:关注头条号Gorhaf,私信“Java学习小组”... 查看详情

“全栈2019”java第九十二章:外部类与内部类成员覆盖详解

...v2018.3文章原文链接“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解下一章“全栈2019”Java第九十三章:内部类应用场景(迭代器设计模式)学习小组加入同步学习小组,共同交流与进步。方式一:关注头条号Gorhaf,私... 查看详情

kotlin内部类与嵌套类(代码片段)

kotlin内部类与嵌套类简单的说,kotlin嵌套类相当于java的静态内部类,kotlin内部类相当于java普通内部类。classOutClassvalocval="一个外部类变量值"//嵌套类,相当于Java的静态内部类classNestedClassfuntest1()="嵌套... 查看详情

kotlin内部类与嵌套类(代码片段)

kotlin内部类与嵌套类简单的说,kotlin嵌套类相当于java的静态内部类,kotlin内部类相当于java普通内部类。classOutClassvalocval="一个外部类变量值"//嵌套类,相当于Java的静态内部类classNestedClassfuntest1()="嵌套... 查看详情

tp框架之model类与命名空间

1.获取系统常量信息publicfunctionshuchu(){var_dump(get_defined_constants());}2.跨控制器或跨模块调用functiondiaoyong(){//跨控制器或跨模块调用用方法//1.造对象调用/*$sc=newIndexController();$sc->index();*///2.使用TP框架的快捷方法A来创建控制器对象//... 查看详情

tp框架之model类与命名空间

1.获取系统常量信息publicfunctionshuchu(){var_dump(get_defined_constants());}2.跨控制器或跨模块调用functiondiaoyong(){//跨控制器或跨模块调用用方法//1.造对象调用/*$sc=newIndexController();$sc->index();*///2.使用TP框架的快捷方法A来创建控制器对象//... 查看详情

“全栈2019”java第一百零四章:匿名内部类与外部成员互访详解

...DEAv2018.3文章原文链接“全栈2019”Java第一百零四章:匿名内部类与外部成员互访详解下一章“全栈2019”Java第一百零五章:匿名内部类覆盖作用域成员详解学习小组加入同步学习小组,共同交流与进步。方式一:关注头条号Gorhaf... 查看详情

object类与常用类,内部类

Object  Object类是Java中所有的的父类,相当于树结构中的根节点ROOT;如果一个类没有明确的标明继承自哪个类,都默认继承自Object类。所以,Java中所有的对象都能赋值给Object类型的引用(多态)。其次,由于子类中能够继承父... 查看详情

spring框架

...出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给 查看详情

java内部类与匿名内部类作用分别是啥?

参考技术AJava内部类\\x0d\\x0a分四种:成员内部类、局部内部类、静态内部类和匿名内部类。\\x0d\\x0a1、成员内部类:即作为外部类的一个成员存在,与外部类的属性、方法并列。\\x0d\\x0a注意:成员内部类中不能定义静态变量,但... 查看详情

请问java单例类与静态类有何不同?

...一个实例。静态类在一个类中创建另外一个类,叫做成员内部类。这个成员内部类可以静态的(利用static关键字修饰),也可以是非静态的。由于静态的内部类在定义、使用的时候会有种种的限制。所以在实际工作中用到的并不... 查看详情

函数式接口的匿名内部类与lambda表达式的实现(代码片段)

文章目录函数式接口一、函数式接口:二、Lambda表达式:三、常用函数式接口:实现代码:函数式接口一、函数式接口:函数式接口主要指只包含一个抽象方法的接口,如:java.lang.Runnable、java.util.Comparator接口等Java8提供@... 查看详情