這次介紹門面模式,主旨思想就是客戶端通過一個統一的對象,完成一系列任務。而客戶端是不用知道每一個任務的具體實現和順序。可以理解爲門面對象整理好一系列任務,我們直接調用就行。
自從開了彩筆廠後,大熊每日的工作日漸繁忙,各種工作,應酬,交際,應接不暇。每天忙的暈頭轉向。
我們先看一下大熊自己怎麼安排一天的工作
大熊是彩筆廠的老闆(Boss)
class Boss {
//工作
fun work(workInfo: String) {
println("boss 去 $workInfo")
}
}
一天的工作計劃
interface Work {
fun doWork(boss: Boss)
}
//一天的行程計劃表
class WorkOne : Work {
override fun doWork(boss: Boss) {
boss.work("開會")
}
}
class WorkTwo:Work{
override fun doWork(boss: Boss) {
boss.work("飯局")
}
}
class WorkThree:Work{
override fun doWork(boss: Boss) {
boss.work("去工廠考察")
}
}
class WorkFour : Work {
override fun doWork(boss: Boss) {
boss.work("趕飛機出差")
}
}
大熊的一天開始了
fun main(args: Array<String>) {
//一天的開始
//大熊起牀
var boss = Boss()
//自己打開工作計劃表
var work1 = WorkOne()
var work2 = WorkTwo()
var work3 = WorkThree()
var work4 = WorkFour()
//安排自己的工作
work1.doWork(boss)
work2.doWork(boss)
work3.doWork(boss)
work4.doWork(boss)
}
------------------------------------------------
logcat:
boss 去 開會
boss 去 飯局
boss 去 去工廠考察
boss 去 趕飛機出差
如果大熊要修改工作安排,就得不停的切換workList。從代碼上來說,就是把所有具體方法都暴露出來,客戶端就需要知道每個方法的具體實現。這就導致了代碼過渡耦合,客戶端和具體實現方法的複雜度大大提高了。
爲了解決這種情況,大熊決定找個助理,讓他每天幫忙安排工作議程。
這樣,我們的門面對象(Assistant)就出來了
class Assistant{
//助理列出了一天的工作
var work1 = WorkOne()
var work2 = WorkTwo()
var work3 = WorkThree()
var work4 = WorkFour()
//安排
fun plan(boss: Boss){
//提醒boss做第一條工作
work1.doWork(boss)
work2.doWork(boss)
work3.doWork(boss)
work4.doWork(boss)
}
}
大熊招了助理後,新的一天
fun main(args: Array<String>) {
//一天的開始
//大熊起牀
var boss = Boss()
//把助理叫過來
var assistant = Assistant()
//讓助理安排自己的工作
assistant.plan(boss)
}
大熊再也不會因爲工作議程忙的焦頭爛額
至此,門面模式的優勢就體現出來了
把一堆功能都交給門面對象來處理,客戶端只需調用門面對象。在門面對象中修改處理流程,都不會影響客戶端,也就實現了簡單的解耦。