考察面向?qū)ο蠛驮O(shè)計能力
題目1

image.png
要求:
1、畫出UML類圖
2、用ES6語法寫出該示例
解答:
一、分析
- 打車時,可以打?qū)\嚮蛘呖燔嚒H魏诬嚩加熊嚺铺柡兔Q
可以解讀出,有個公共的父類—車,里面包括車牌號和名稱屬性,有2個子類快車和專車,他們可以繼承父類的屬性
- 不同車價格不同,快車每公里1元,專車每公里2元
說明子類(快車和專車)有自己的屬性—價格
- 行程開始時,顯示車輛信息
- 行程結(jié)束時,顯示打車金額(假定行程5公里)
以上兩句說明,行程和車有關(guān)系,所以建立一個行程的類,引用車這個類,便具有了車的屬性(車輛信息)
1、UML類圖

image.png
2、用ES6語法寫出該示例
class Car {
constructor(number, name) {
this.number = number
this.name = name
}
}
class KuaiChe extends Car {
constructor(number, name) {
// 將車輛信息和名稱交個父類處理,自己處理價格即可
super(number, name)
this.price = 1
}
}
class ZhuanChe extends Car {
constructor(number, name) {
// 將車輛信息和名稱交個父類處理,自己處理價格即可
super(number, name)
this.price = 2
}
}
class Trip {
constructor(car) {
this.car = car
}
start() {
console.log(`行程開始,車輛信息${this.car.name}`)
}
end() {
console.log(`行程結(jié)束,車輛價格${this.car.price*5}`)
}
}
let kc = new KuaiChe(666,'奔馳');
let trip = new Trip(kc)
trip.start()
trip.end()
題目2

image.png
要求:
1、畫出UML類圖
2、用ES6語法寫出該示例
解答:
一、分析
- 某停車場,分三層,每層100車位
包含三個類停車場(park)、層(floor)、車位(place)
- 每個車位都能監(jiān)控到車輛的駛?cè)牒碗x開
車位(place)這個類里面有方法監(jiān)聽車輛的駛?cè)耄╥n)和離開(out),判讀其狀態(tài)(emtpy)是否為空
- 車輛進(jìn)入前,顯示每層的空余車輛數(shù)量
車輛進(jìn)入前,面對的是停車場(park),所以空余車輛數(shù)量的信息是由停車場釋放出來,停車場(park)里面有個方法,顯示每層空余車輛數(shù)量,具體的實現(xiàn)方法交個層(floor)這個類,最后由停車場匯總所有層數(shù)的空余數(shù)量(emptyPlaceNum)
- 車輛進(jìn)入時,攝像頭可識別車牌號和時間
攝像頭(Camera)也需要定義一個類,識別車牌號和時間,需要存儲,這個信息是存儲在停車場這個類里面的,在停車場里面加個車輛列表(carList)
- 車輛出來時,出口顯示器顯示車牌號和停車時長
顯示器(screen)也要定義類,顯示車牌號,通過車牌號拿到之前的記錄時間(time),用當(dāng)前時間減去記錄時間就是停車時長
1、UML類圖

image.png
2、用ES6語法寫出該示例
// 車
class Car {
constructor(num) {
this.num = num
}
}
// 入口攝像頭
class Camera {
shot(car) {
// 返回車牌號和停車時間
return {
num: car.num,
inTime: Date.now()
}
}
}
// 出口顯示器
class Screen {
show(car, inTime) {
console.log('車牌號', car.num)
// 當(dāng)前時間減去停車時間=停車長
console.log('停車時長', Date.now() - inTime)
}
}
// 停車場
class Park {
// 初始化參數(shù)層數(shù)、攝像頭、屏幕、車輛信息
constructor(floors) {
this.floors = floors || []
this.camera = new Camera()
this.screen = new Screen()
// 存儲攝像頭拍攝返回的車輛信息
this.carList = {}
}
in(car) {
// 獲取攝像頭的信息:號碼 時間
const info = this.camera.shot(car)
// 停到某個車位,隨機(jī)停的
const i = parseInt(Math.random() * 100 % 100)
// 這里是第一層
const place = this.floors[0].places[i]
place.in()
// 車已經(jīng)停進(jìn)去了,停到哪個車位的信息在放到info里去
info.place = place
// 記錄信息
this.carList[car.num] = info
}
out(car) {
// 獲取信息
const info = this.carList[car.num]
// 將停車位清空重新賦值
const place = info.place
place.out()
// 顯示時間
this.screen.show(car, info.inTime)
// 刪除信息存儲,否則造成內(nèi)存泄露
delete this.carList[car.num]
}
// 算出總的空車位
emptyNum() {
return this.floors.map(floor => {
return `${floor.index} 層還有 ${floor.emptyPlaceNum()} 個車位`
// 返回的是數(shù)組,所以通過join變成字符串
}).join('\n')
}
}
// 層
class Floor {
// 層數(shù)(index)和車位(place)
constructor(index, places) {
this.index = index
this.places = places || []
}
// 通過車位算出每層有多少空車位
emptyPlaceNum() {
let num = 0
this.places.forEach(p => {
if (p.empty) {
num = num + 1
}
})
return num
}
}
// 車位
class Place {
constructor() {
// 默認(rèn)是沒有的,車位是空的
this.empty = true
}
// 進(jìn)入時,狀態(tài)為false,車位是有車的
in() {
this.empty = false
}
// 駛出時,狀態(tài)為true,車位是沒有車的
out() {
this.empty = true
}
}
// 測試代碼------------------------------
//初始化才層數(shù),有三層,分為100個車位
const floors = []
for (let i = 0; i < 3; i++) {
const places = []
for (let j = 0; j < 100; j++) {
places[j] = new Place()
}
floors[i] = new Floor(i + 1, places)
}
// 初始化停車場
const park = new Park(floors)
// 初始化車輛
const car1 = new Car('A1')
const car2 = new Car('A2')
const car3 = new Car('A3')
console.log('第一輛車進(jìn)入')
console.log(park.emptyNum())
park.in(car1)
console.log('第二輛車進(jìn)入')
console.log(park.emptyNum())
park.in(car2)
console.log('第一輛車離開')
park.out(car1)
console.log('第二輛車離開')
park.out(car2)
console.log('第三輛車進(jìn)入')
console.log(park.emptyNum())
park.in(car3)
console.log('第三輛車離開')
park.out(car3)