web前端進(jìn)階之js設(shè)計模式面試篇

考察面向?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)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容