---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a&amp;gt;<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! --------------------
一、面向对象的分析与设计思路
1.思路
1.深刻理解事物的本质,然后根据需求,确定有那些类或对象。
2.确定类与类之间,或对象与对象之间是如何进行消息传递的。
3.尽量考虑类的重用性、可扩展性。
重要经验:谁拥有数据,谁就对外提供操作这些数据的方法。谁拥有属性,谁就拥有对属性操作的行为。
2.案例:
(1)人在黑板上画圆:画圆的这个动作要放到圆的类中。因为圆心和半径的属性都要放到圆类中作为私有变量,而画元还需要这些属性,所以该方法要放到圆类中。
(2)列车司机紧急刹车:刹车的这个动作,是由人发送刹车的命令,然后有车的刹车系统进行刹车的动作,所有刹车的这个动作要放到车的类中。
(3)你把门关上:关门的这个动作也要放到门这个类中,因为人只是发出了推门的动作,然后门自己和门框合并,出现关门的动作。
二、7k面试题笔记及其对应的伪代码
1.交通灯管理系统
分析共四类对象,交通灯、灯控制器、路线、汽车。但汽车属于道具,只是负责演示使用,所以不必考虑汽车这个类,那么其他三个类的伪代码设计如下:
(1)交通灯类
/**
* 交通灯类
*/
public enum Lamp {
/*
* 12个方向,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 String opposite;//当前灯的颜色,红或绿
private String next;//下一个灯的颜色
/*
* 交通灯变绿
*/
public void light(){
。。。。。。。
}
/*
* 交通灯变红
*/
public Lamp blackOut(){
。。。。。。。。。
}
}
(2)路线类
/**
* 路线类
* 负责定义每条路线上的车辆以及模拟各个车辆在路线上行驶
*/
public class Road {
private List<String> vechicles=new ArrayList<String>();//路上有很多车
private String name;//路线名称
public Road(String name){
this.name=name;
/*
* 构造在路上的行驶的车辆
*/
ExecutorService pool=Executors.newSingleThreadExecutor();
pool.execute(new Runnable(){
@Override
public void run() {
/*
* 产生车集合
*/
for(int i=1;i<1000;i++){
vechicles.add(Road.this.name+"_"+i);
}
}
});
/**
* 定时器
* 相隔一段时间模拟车在不同的路段上行驶
*/
ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable(){
@Override
public void run() {
if(vechicles.size()>0){
System.out.println(vechicles.remove(0)+" is traversing !");
}
}
}, 1, 1, TimeUnit.SECONDS);
}
}
(3)交通灯控制器
/**
* 交通灯控制器类
* 负责满足一定条件下交通灯的路线切换
*/
public class LampController {
private Lamp currentLamp;//当前灯
public LampController(){
currentLamp =Lamp.S2N;
currentLamp.light();
/*
* 定时器
* 负责初始化各个交通灯的颜色
*/
ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable(){
@Override
public void run() {
currentLamp = currentLamp.blackOut();
}
}, 10, 10, TimeUnit.SECONDS);
}
}
2.银行业务调度系统
分析共四类对象,客户、业务窗口、号码管理器、取号机器。因为该需求重点是各个业务窗口的转换问题,并没有深入研究客户,所以客户类不用创建。那么其他三个类的伪代码设计如下:
(1)业务窗口
/**
* 服务窗口
* 负责创建窗口并模拟各个窗口办理各种客户的业务
*/
public class ServiceWindow {
private CustomerType type=CustomerType.COMMON;//客户类型
private int windowId=1;//窗口号码
public void setType(CustomerType type) {
this.type = type;
}
public void setWindowId(int windowId) {
this.windowId = windowId;
}
/**
* 模拟各个窗口通过各种用户类型办理各种业务
*/
public void start(){
Executors.newSingleThreadExecutor().execute(new Runnable(){
@Override
public void run() {
while(true){
switch(type){
case COMMON:
commonService();//普通服务窗口
break;
case EXPRESS:
expressService();//快速服务窗口
break;
case VIP:
vipService();//VIP服务窗口
break;
}
}
}
});
}
//普通服务业务办理窗口
private void commonService(){}
//快速服务业务办理窗口
private void expressService(){}
//VIP服务业务办理窗口
private void vipService(){}
}
(2)取号机器类
/**
* 取号器
* 有三种类型的客户,分别取各自的排队等待号码,因为取号机器只有一个
* 所以设计为单例模式
*/
public class NumberMachine {
private NumberManager commonManager =new NumberManager();//普通客户
private NumberManager expressManager =new NumberManager();//快速客户
private NumberManager vipManager =new NumberManager();//vip客户
public NumberManager getCommonManager() {
return commonManager;
}
public NumberManager getExpressManager() {
return expressManager;
}
public NumberManager getVipManager() {
return vipManager;
}
private NumberMachine(){}
public static NumberMachine getInstance(){
return instance;
}
private static NumberMachine instance=new NumberMachine();
}
(3)号码管理器类
/**
* 号码管理器
* 负责生成新的排队号码以及各种类型的客户取走的排队号码
*/
public class NumberManager {
private int lastNumber=1;//最新号码
private List<Integer> queueNumber = new ArrayList<Integer>();//取走的号码队列
/**
* 生成新号码
*/
public synchronized Integer generateNewManager(){
queueNumber.add(lastNumber);
return lastNumber++;
}
/**
* 客户所取的号码
*/
public synchronized Integer fetchServiceNumber(){
Integer number=null;
if(queueNumber.size()>0){
number=queueNumber.remove(0);
}
return number;//删除那个对象,则返回值就是该对象
}
}
---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a&amp;gt;、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
详细请查看:<a href="http://www.itheima.com" target="blank">www.itheima.com</a>