面向对象设计
人在黑白上画圆
存在3个对象,人,黑板,圆
Person blackboard circle
draw()是画圆的方法,因该归属到哪个对象?
一般情况,做出画圆的这个动作应该属于人这个对象!可是:
draw()需要用到圆心,半径,这些变量都是Circle对象的,所以,draw()属于circle
这是Java的设计方式,不同于广义函数,方法不属于对象,而是独立存在的函数,由参数类型决定操作的对象,这种面向对象在在设计上更加灵活也更容易解释
两块石头磨成一把刀,石刀可以砍树,砍成木材,木材做成梯子
这里有5种类型对应5类对象---->石头,刀,树,木材,梯子
其中石头-刀,树-木材-梯子的关系不是操作关系,而是从一种形态到另一种形态,石头做成了刀,石头就没了只剩下刀了,所以应采用Factory模式。建立一个KnifeFactory类包含有makeKnife()方法,传入两个stone对象,返回一个knife对象。树-木材-梯子之间的关系也是如此
交通灯管理系统的设计
一个十字路口总共有12种方向,其中4个常通,两外8个两两相对,所欲需要12个交通灯对象来控制车辆行驶,由于4个是常亮的,另外8个两两相对,所以实际参与逻辑运算的只有4个
系统中总共需要2种对象,路、灯。灯可以适用枚举
public enum Lamp
需要12种枚举对象表示12个灯
S2N,S2W,E2W,E2S,N2S,N2E,W2E,W2N,S2E,E2N,N2W,W2S
使用构造方法来指定于灯对象相对的灯,下一个会亮的灯以及是否两着
private Lamp(String opposite,String next,boolean lighted)
建立2个方法,亮灯和熄灯
public void light()
亮灯--->会连着与之相对的灯一起亮,例如南到北相对是北到南
public Lamp blackOut()
熄灯---->也会连着与之相对的灯一起熄灭,并且点亮下一盏灯,并返回下一盏灯枚举对象
public class Road
路需要一个集合来保存字符串类型的车辆
private List<String> wheels= new ArrayList<String>();
在构造方法种加入线程执行器
xecutors.newSingleThreadExecutor().execute(new Runnable(){
}
管理车辆的加入
Thread.sleep((new Random().nextInt(10) + 1) * 1000);
每隔1到10秒之间加入一辆新等待的车辆(随机数其实也就差不多5秒左右来一辆)
和线程调度器分别管理车辆的加入和监控红绿灯情况释放车辆
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){...}1,1,TimeUnit.SECONDS);
每秒监控红绿灯
只要一建立Road对象,就会实现线程监控调度
最后需要建立一个控制器,建立另一个线程调度器每隔10秒换一次灯
public class LampController......
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){...}10,10,TimeUnit.SECONDS);
系统基本完成