对象的交互--时钟实例

    科技2025-08-20  13

    对象的交互

    耦合度:对象和对象之间的联系紧密程度叫做耦合。

    对象和对象的耦合程度越紧,表现在源代码上,就是它们的代码是互相依赖、互相牵制的。我们理想的模型,是对象和对象之间的耦合要尽可能的松,平行的对象要尽量减少直接联系,让更高层次的对象来提供通信服务。

    当一个对象里面又多个对象的时候,对象之间如何实现交互,对象之间的关系如何建立,对象之间如何进行交流。

    我们将这个表示时间的看成两个数字为什么呢,因为我发现说对于小时和分钟来说,他们很多相似的地方,又可以说他们都应该显示一个数。在他的数值是多少,都应该都能够做一个动作或者说提供一个服务就是去加一,滴答一下,再加一的这个过程。还会有那么一个有趣的反应,就是他们都要这上限,我们都知道分钟到了59再加一他要变成零,小时呢知道了23再加一会变成零,所以他们有很多相似的东西,但是他们也有一些不同的东西。 用图来理解就是:

    这一部分代码段:

    public class display { private int value=0; private int limit=0; public display(int limit) { this.limit=limit; } public void increase() { value++; if(value==limit){ value=0; } } public int getvalue() { return value; } public static void main(String[] args) { display d=new display(24); while(true) { //这是一个死循环 d.increase(); System.out.println(d.getvalue()); } } }

    上述代码,我们只需要它能够实现两个功能:每次加一,还有是不是能够到了二十四变为零,很简单的一段代码。 很显然,这只能实现两位,需要两个这样的Display,一个表达小时,一个表达分钟,把这两个组合起来。还需要一个Clock类,这个类里面有hour和minute,这两个成员刚好是display类型的,我们用一个类的两个对象去建立另外一个类。接下来的问题是,这两个display的对象是怎么互动的,当表达minute的这个display加到59时,要通知hour要increase了,这个互动怎么做,是一个难点。 我希望我们用一个类来表达这两个对象,这两个对象之间没有直接联系,没有直接联系的好处就是他们各自独立。当我在写minute的时候不要考虑hour怎么办,写hour地时候不要考虑minute怎么办。那么他们之间的联系。必定要通过第三方,就是那个Clock,Clock是凌驾于这两个对象之上的。

    代码:

    public class CLOCK { private display hour =new display(24); //Display类的hour private display minute=new display(60); //Display类的minute public void start() { while(true) { minute.increase(); if(minute.getvalue()==0) { hour.increase(); } System.out.printf("%02d:%02d\n", hour.getvalue(),minute.getvalue()); } } public static void main(String[] args) { CLOCK c=new CLOCK(); c.start(); } } 简单概括就是:一个类里面它的成员变量可以是其他类的对象。由Clock将两个display联系起来,这个start函数就是让分钟的display去increase,这个increase的结果再去让另一个display去increase。

    完整代码如下:

    public class Main1 { public static void main(String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); Clock clock = new Clock(in.nextInt(), in.nextInt(), in.nextInt()); clock.tick(); System.out.println(clock); in.close(); } } class Clock{ private Display hour; private Display minute; private Display second; public Clock(int hour,int minute,int second){ this.hour = new Display(24, hour); this.minute = new Display(60, minute); this.second = new Display(60, second); } public void tick(){ if(second.increase()){ if(minute.increase()) hour.increase(); } } public String toString(){ String s = String.format("%02d:%02d:%02d", hour.getValue(),minute.getValue(),second.getValue()); return s; } } class Display{ private int value = 0; private int limit = 0; public Display(int limit,int value){ this.limit=limit; this.value=value; } public boolean increase(){ boolean k = false; value++; if(value==limit){ value=0; k = true; } return k; } public int getValue(){ return value; } }
    Processed: 0.021, SQL: 8