面向对象程序设计 对象的交互思路 JAVA数字时钟(自己学习的一些感悟,欢迎大佬交流)

作为一名JAVA初学者,要知道学习JAVA就是学习对象(Object Oriented),对象也就是面向对象程序设计(OOP)的核心

面向对象程序设计的第一步,就是在问题领域中识别出有效的对象,然后从识别出的对象中抽象出类来。面对纷繁复杂的现实问题,往往存在多种对象划分的方式,而不同的划分会带来类的设计以至于程序结构的各种不同。对象划分有一些理论,但是不是这门面向对象的入门课程能覆盖的。而且目前的理论也还不是放诸四海皆准的简单操作指南。我们举了一个数字钟的例子,希望通过这个例子表明对象划分的重要性,给你一个感性认识。在今后面对实际的问题领域时,可以试试用这里提到的概念来做对象的划分和类的设计。但是这只是一个例子,遇到具体情况一定是具体分析,按照问题领域的实际情况来做。

一个对象当然可以由其他类的对象来组成,就像一个人体里面有心脏、肠胃一样。对象是由其他对象组成的,而类定义了这样的组合关系。

那么下一个问题,就是当一个对象里有多个对象的时候,那些对象之间是如何交互的,对象和对象之间的联系是如何建立的,对象如何和其他对象交流。对象和对象之间的联系紧密程度叫做耦合。对象和对象的耦合程度越紧,表现在源代码上,就是它们的代码是互相依赖、互相牵制的。我们理想的模型,是对象和对象之间的耦合要尽可能的松,平行的对象要尽量减少直接联系,让更高层次的对象来提供通信服务。这些就是在我们这个非常简单的数字钟的例子中所体现的。

要实现一个数字钟非常简单,这里最重要的是一种思想,是更深层次的面向对象设计的理念。

我们现在看一下接下来数字时钟的问题:

数字时钟

**如果不是面向对象,那么这就是一个循环就完了,然后每隔一分钟怎么样怎么样。**如果是面向对象,面向对象的思维方式。我们要去看到在这个地方有些什么样的东西,每一个东西有什么样的属性,然后这些东西之间是如何交互的。
这是四个数字应该是有一些东西去组成的,我们要去做的事情是我们怎么去识别。如何划分这四个数字,最合理的方法就是:我们把它看作是两个,两位数字的显示器。
两位数字的显示器的一种划分是不是更为合理呢?为什么呢,因为我发现说对于小时和分钟来说,他们很多相似的地方,又可以说他们都应该显示一个数。在他的数值是多少,都应该都能够做一个动作或者说提供一个服务就是去加一,滴答一下,再加一的这个过程。还会有那么一个有趣的反应,就是他们都要这上限,我们都知道分钟到了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();
	}
}

代码不长,但是提供给我们的思想很丰富,对象的互相交互,让我们更加深层次的了解了对象这个概念,这是JAVA语言的根本。这也是我写着一篇文章的理由,不仅让我这个JAVA新手加深了对象交互这一概念,也让大家可以共同学习。
再画一个图去理解一下,里面的内存就是这样的:
在这里插入图片描述

总结一下:一个类里面它的成员变量可以是其他类的对象。由Clock将两个display联系起来,这个start函数就是让分钟的display去increase,这个increase的结果再去让另一个display去increase。

发布了1 篇原创文章 · 获赞 2 · 访问量 186

猜你喜欢

转载自blog.csdn.net/SUNYAN_WADE/article/details/104410859