---------------------- android培训、java培训、期待与您交流! ----------------------
交通灯管理系统是一个小项目.做项目不要着急写代码,代码只是一种表现形式而已.我们需要掌握设计对象的思想,下面是看张老师视频中的几个案例.
1:人在黑板上画圆.画圆的方法应该是在圆中的,因为数据在圆自己里面(圆心坐标点,与半径),人只是去调用方法.
2:列出司机紧急刹车.刹车的动车肯定车是最清楚的,所以刹车的方法应该再车里面.通过人对象调用
3:售货员统计收获小票的金额.小票的金额小票本身肯定最清楚因为数据都在小票上(每个商品的金额)最后再定义一个求和方法就可以了.
两个面向对象的面试题.
1:两块石头磨成一把石刀,石刀可以砍树,砍成木材,木材做成椅子.
首先定义这几个变量.
Stone First
Stone second
将石头变成石刀石头就没有了,所以这不是石头里面的方法.
这里就有要有一个制作刀的工厂,工厂就有制作刀的方法,接受的是这两个石头返回的类型就是石刀
所以石刀就可以写成
StoneKnife=KnifeFactory.createKnife(Stone First,Stone second)
StoneKnife
石刀就应该有砍树的功能,接受的是tree返回类型就是木材
所以木材就可以写成:
material = StoneKnife.cut(tree)
tree
material
木材做成椅子,木材就没有了,所以木材不应该有做成椅子的方法.
所以就应该有个椅子工厂,工厂就有制作椅子的方法,接受的就是木材
所以椅子就可以写成
chair = ChairFactory.makeChair(tree)
chair
2:球从一根绳子的一段移动到另一端.
分析应该有2个对象,一个是绳子 Rope,一个是球Ball
class Rope{
绳子就有长度,就应该有起始点,与结束点
所以定义2个变量
private Point start;
private Point end;
绳子的构造方法,即产生绳子就应当接受这两个变量起始点与结束点.
public Rope(Point start,Point end){
this.start=start;
this.end = end;
小球需要移动,绳子必须给小球移动到那个点的数据,所以小球就应当有个方法
给球计算移动的点的数据.
public Point nextPoint(Point currentPoint)//通过小球当前的点,计算小球下次移动的点{
//这里应该有计算方法.当这个点是终点的时候返回null,如果不是绳子上的点就抛出异常.
}
}
class Ball{
使得球与绳子产生联系,所以球中应应该有绳子
private Rope rope;
随着球的移动,就应该是移动在绳子上的某个点,所以就必须创建这个移动的点\
private Point currentPoint;
public Ball (Rope rope,startPoint){
this rope = rope;
this currentPoint = startPoint;//小球当前状况下在绳子上的点
}
小球移动的方法
public void move(){
currentPoint = rope.nextPoint(currentPoint)//小球当前的点,是绳子计算出来的,通过绳子计算出移动的点就是绳子下个时候的当前点;
//打印绳子移动到了什么位置
sop("小球移动到了"+currentPoint );
}
}
}
下面是我参考张孝祥老师的视频跟着写的,并做了些注释.
//创建路对象
package Protect_TrafficLight;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
//创建路对象.路上有很多车辆,车辆就相当于元素,
//那么就可以把路就可以看成一个容器,那么路就可以可看成一个集合.
//集合有List集合,有Set集合,因为不用考虑集合中元素的排序问题可可重复问题
//这里考虑用List集合
public class Road {
List<String> vehicle = new ArrayList<String>();//这里体现多态思想用子类实例对象创建对象
//因为有12条路,给路起好名字才好车起名字,所以通过构造给路起名字
private String name = null;
public Road(String name){
this.name = name;
//假设路创建完后,随机的在路上增加车辆,假设每条路上每秒产生一辆车.假设产生1000辆车
//这里使用JAVA5 的线程库创建线程.创建一组线程池.可以保证顺序执行任务
ExecutorService pool = Executors.newSingleThreadExecutor();
pool.execute(new Runnable(){
@Override
public void run() {
for(int i=1;i<1001;i++){
//每一秒中产生一辆车,我们很容易想到创建一个线程,让线程在这里沉睡1秒
//这里为什么不用Thread.sleep(1000),因为在这里睡住了,对象就无法返回了.
try {
Thread.sleep((new Random().nextInt(10)+1)*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
vehicle.add(Road.this.name+" "+i);//这里是内部类想要访问外部类的成员变量外部类的成员变量必须用final修饰
//这里访问外部类的变量可以使用外部类的名字加this使用
}
}
});
//创建一个定时器,每隔一秒车看灯是是绿的,如果是绿的,车就开走.
ScheduledExecutorService time = Executors.newScheduledThreadPool(1);
time.scheduleAtFixedRate(new Runnable(){
@Override
public void run() {
if(vehicle.size()>0){
boolean lighted = lamp.valueOf(Road.this.name).isLight();
if(lighted){
//这里就是返回那个开走的车.即返回的是集合的第一个对象vehicle.remove(0);
System.out.println(vehicle.remove(0)+"开走了");
}
}
}
},
1,
1,
TimeUnit.SECONDS);
}
}
//用枚举定义灯
package Protect_TrafficLight;
//因为这些灯都是固定的.要想拿到这些灯,就必须使用规定的灯,所以使用枚举.
public enum lamp {
//灯有12个.有四个灯是常绿的(右转弯的灯),有四个灯与它相对应的灯是状态是相同的.
//所以主要定义好规定的四个灯就好了
//自定义规定的四个灯
S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),
//与他对应的灯.
N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false),
//右转弯常绿的灯
S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);
private boolean lighted;//定义灯的状态.
//private lamp opposite;定义下一个灯为什么不能这样用,
// 如果这样写了把对应的灯传给规定的灯的时候会出错,因为那个时候对应的灯还没创建出来
private String opposite;
private String next;//定义下一个灯
public boolean isLight(){
return lighted;
}
private lamp(String opposite,String next,boolean lighted){
this.opposite=opposite;
this.next=next;
this.lighted=lighted;
}
public void light(){
this.lighted=true;
if(opposite!=null){
lamp.valueOf(opposite).light();
System.out.println(name()+"变绿了");
}
}
public lamp black(){
this.lighted=false;
if(opposite!=null){
System.out.println("绿灯从"+name()+"切换为"+ next );
lamp.valueOf(opposite).black();
}
lamp nextlamp = null;
if(next!=null){
nextlamp = lamp.valueOf(next);
nextlamp.light();
}
return nextlamp;
}
}
//定义控制灯的控制器
package Protect_TrafficLight;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class lampcontroller {
//创建灯的控制器.
private lamp currentlamp;//定义灯的当前状态.
public lampcontroller() {
currentlamp=lamp.S2N;
currentlamp.light();
//创建灯的定时器.控制等每隔10秒就把当前变绿的灯变黑.
ScheduledExecutorService time = Executors.newScheduledThreadPool(1);
time.scheduleWithFixedDelay(new Runnable(){
@Override
public void run() {
currentlamp = currentlamp.black();
}},
10,
10,
TimeUnit.SECONDS);
}
}
//创建主函数创建对象,调用对象
package Protect_TrafficLight;
public class mainClass {
/**
* @param args
*/
public static void main(String[] args) {
//创建路的对象.由于路由12条比较多.所以这里定义一个数组,比较好.
String[] Roads = new String[]{"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};
for(int i=0;i<Roads.length;i++){
new Road(Roads[i]);
}
new lampcontroller();
}
}
---------------------- android培训、 java培训、期待与您交流! ----------------------