黑马程序员_7k面试题学习笔记

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a&amp;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;amp;gt;、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
详细请查看:<a href="http://www.itheima.com" target="blank">
www.itheima.com</a>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值