/ 從設計到模式
// 設計模式簡介
// 設計
// 模式
// 分開
// 從設計到模式
// 23種設計模式
// 創建型
// 工廠模式(工廠方法模式,抽象工廠模式,建造者模式)
// 單例模式
// 原型模式
// 組合型
// 行為型
// 策略模式
// 模板方法模式
// 觀察者模式
// 迭代器模式
// 職責連模式
// 命令模式
// 備忘錄模式
// 狀態模式
// 訪問者模式
// 中介者模式
// 解釋器模式
//結構型
// 適配器模式
// 裝飾器模式
// 代理模式
// 外觀模式
// 橋接模式
// 組合模式
// 享元模式
// 打車時,可以打專車或者快車。任何車都有車牌號和名稱
// 不同車價格不同,快車每公里1元,專車每公里2元
// 行程開始時,顯示車輛信息
// 行程結束時,顯示打車金額(假定行程就5公里)
// 畫出UML類型
// 用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},車牌號:${this.car.number}`)
}
end(){
console.log('運行結束,價格:'+ (this.car.price)*5)
}
}
// 測試
// let car = new Kuaiche(100,"北京現代")
// let trip = new Trip(car)
// trip.start()
// trip.end()
// 某停車場,分3層,每層100車位
// 每個車位都能監控到車輛的駛入和離開
// 車輛進入前,顯示每層的空余車位數
// 車輛進入時,攝像頭可識別車牌號和時間
// 車輛出來是,出口顯示車牌號和停車時長
// 車
class Car{
constructor(num){
this.num = num
}
}
// 停車場
class Park{
constructor(floors){
this.floors = floors || []
this.camera = new Camera()
this.screen = new Screen()
this.cartList = {} //存儲
}
in(car){
//
const info = this.camera.shot(car)
const i = parseInt(Math.random()*100%100)
const place = this.floors[0].places[i]
place.in()
info.place = place
this.cartList[car.num] = info
console.log(this.cartList)
}
out(car){
const info = this.cartList[car.num]
// 講停車位清空
const place = info.place
place.out()
// 顯示時間
this.screen.show(car,info.inTime)
// 清空
delete this.cartList[car.num]
}
emtpyNum(){
return this.floors.map(floor =>{
return `${floor.index} 層還有${floor.emptyPlaceNum()}個車位`
}).join('\n')
}
}
// 層次
class Floor{
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(){
this.empty = true
}
in(){
this.empty = false
}
out(){
this.empty = true
}
}
// 攝像頭
class Camera{
shot(car){
return {
num: car.num,
inTime: Date.now()
}
}
}
// 出口顯示器
class Screen{
show(car,inTime){
console.log("車牌號",car.num)
console.log("停車時間", Date.now() - inTime)
}
}
//初始化停車場
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(100)
const car2 = new Car(200)
const car3 = new Car(300)
park.in(car1)
console.log(park.emtpyNum())
park.in(car2)
console.log(park.emtpyNum())
park.out(car1)
console.log(park.emtpyNum())
park.out(car2)
console.log(park.emtpyNum())
park.in(car3)
console.log(park.emtpyNum())
park.out(car3)
console.log(park.emtpyNum())
// 1 層還有99個車位
// 2 層還有100個車位
// 3 層還有100個車位
// 1 層還有98個車位
// 2 層還有100個車位
// 3 層還有100個車位
// 車牌號 100
// 停車時間 17
// 1 層還有99個車位
// 2 層還有100個車位
// 3 層還有100個車位
// 車牌號 200
// 停車時間 3
// 1 層還有100個車位
// 2 層還有100個車位
// 3 層還有100個車位
// 1 層還有99個車位
// 2 層還有100個車位
// 3 層還有100個車位
// 車牌號 300
// 停車時間 5
// 1 層還有100個車位
// 2 層還有100個車位
// 3 層還有100個車位