自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

外觀模式,一個(gè)每天都在用,卻被多數(shù)人在面試中忽視的模式

開發(fā) 前端
現(xiàn)代的軟件系統(tǒng)都非常復(fù)雜,盡管我們已經(jīng)想盡一切方法將其“分而治之”,把一個(gè)系統(tǒng)劃分為好幾個(gè)較小的子系統(tǒng)了,但是仍然可能會(huì)存在這樣的問(wèn)題:子系統(tǒng)內(nèi)有非常多的類,客戶端往往需要和許多對(duì)象打交道之后才能完成想要完成的功能。

大家好,這里是每周都在陪你一起進(jìn)步的網(wǎng)管~!今天繼續(xù)設(shè)計(jì)模式學(xué)習(xí)之旅,這次咱們分享個(gè)大家每個(gè)人在寫代碼時(shí)都用過(guò),但面試時(shí)經(jīng)常忽視它的設(shè)計(jì)模式--外觀模式,我們一起來(lái)看看吧。

現(xiàn)代的軟件系統(tǒng)都非常復(fù)雜,盡管我們已經(jīng)想盡一切方法將其“分而治之”,把一個(gè)系統(tǒng)劃分為好幾個(gè)較小的子系統(tǒng)了,但是仍然可能會(huì)存在這樣的問(wèn)題:子系統(tǒng)內(nèi)有非常多的類,客戶端往往需要和許多對(duì)象打交道之后才能完成想要完成的功能。

模式的由來(lái)

在我們的生活中醫(yī)院就是這樣的。一般的醫(yī)院都會(huì)分為掛號(hào)、門診、化驗(yàn)、收費(fèi)、取藥等。看病的病人要想治好自己的病(相當(dāng)于一個(gè)客戶端想要實(shí)現(xiàn)自己的功能)就要和醫(yī)院的各個(gè)部門打交道。首先,病人需要掛號(hào),然后門診,如果醫(yī)生要求化驗(yàn)的話,病人就要去化驗(yàn),然后再回到門診室,最后拿藥,經(jīng)過(guò)一系列復(fù)雜的過(guò)程后才能完成看病的過(guò)程。如下圖所示:

圖片

如果我們?cè)卺t(yī)院設(shè)立一個(gè)接待員的話,病人只負(fù)責(zé)和接待員接觸,由接待員負(fù)責(zé)與醫(yī)院的各個(gè)部門打交道,如下圖所示:

圖片

醫(yī)院設(shè)立的接待員的角色就是我們今天要介紹的外觀模式,系統(tǒng)通過(guò)引入外觀模式讓需要調(diào)用多個(gè)子系統(tǒng)各自部分的功能接口以完成的需求,變?yōu)檎{(diào)用方只需要跟外觀提供的統(tǒng)一功能進(jìn)行交互即可。

圖片

引入外觀模式帶來(lái)的變化

模式定義

外觀模式又稱為門面模式,它是一種結(jié)構(gòu)型模式。引入外觀模式后調(diào)用方與多個(gè)子系統(tǒng)的通信必須通過(guò)一個(gè)統(tǒng)一的外觀對(duì)象進(jìn)行,外觀模式為子系統(tǒng)中的功能接口提供一個(gè)一致的界面,此模式定義了一個(gè)高層接口,這個(gè)接口使得這些子系統(tǒng)更加容易使用。

外觀模式的結(jié)構(gòu)

外觀模式的結(jié)構(gòu)其實(shí)很簡(jiǎn)單,用一個(gè)UML圖就能描述清楚外觀模式里擁有哪些角色以及它們各自的特點(diǎn),下面我們看一下外觀模式的類結(jié)構(gòu)。

圖片

外觀模式編程實(shí)現(xiàn)

下面我們用Go代碼實(shí)現(xiàn)一個(gè)外觀模式。

這個(gè)例子里我們把電腦擁有的CPU、RAM內(nèi)存和硬盤視為子系統(tǒng),調(diào)用方想啟動(dòng)電腦就得分別啟動(dòng)這三個(gè)子系統(tǒng)才行,所以我們?cè)谧酉到y(tǒng)上增加一個(gè)外觀對(duì)象,讓調(diào)用方直接調(diào)用外觀對(duì)象,由外觀對(duì)象再去分別對(duì)接子系統(tǒng)最終完成電腦的啟動(dòng)。

該實(shí)例源代碼引用自:https://github.com/yksz/go-design-patterns/blob/master/structure/facade.go

package main

import (
"fmt"
)

const (
BOOT_ADDRESS = 0
BOOT_SECTOR = 0
SECTOR_SIZE = 0
)

type CPU struct{}

func (c *CPU) Freeze() {
fmt.Println("CPU.Freeze()")
}

func (c *CPU) Jump(position int) {
fmt.Println("CPU.Jump()")
}

func (c *CPU) Execute() {
fmt.Println("CPU.Execute()")
}

type Memory struct{}

func (m *Memory) Load(position int, data []byte) {
fmt.Println("Memory.Load()")
}

type HardDrive struct{}

func (hd *HardDrive) Read(lba int, size int) []byte {
fmt.Println("HardDrive.Read()")
return make([]byte, 0)
}

type ComputerFacade struct {
processor *CPU
ram *Memory
hd *HardDrive
}

func NewComputerFacade() *ComputerFacade {
return &ComputerFacade{new(CPU), new(Memory), new(HardDrive)}
}

func (c *ComputerFacade) start() {
c.processor.Freeze()
c.ram.Load(BOOT_ADDRESS, c.hd.Read(BOOT_SECTOR, SECTOR_SIZE))
c.processor.Jump(BOOT_ADDRESS)
c.processor.Execute()
}

func main() {
computer := NewComputerFacade()
computer.start()
}

本文的完整源碼,已經(jīng)同步收錄到我整理的電子教程里啦,可向我的公眾號(hào)「網(wǎng)管叨bi叨」發(fā)送關(guān)鍵字【設(shè)計(jì)模式】領(lǐng)取。

圖片

公眾號(hào)「網(wǎng)管叨bi叨」發(fā)送關(guān)鍵字【設(shè)計(jì)模式】領(lǐng)取。

使用外觀模式的知名庫(kù)

要說(shuō)外觀模式在實(shí)際開發(fā)中的應(yīng)用,首先讓我想起來(lái)的就是Java 里的Slf4j,它是一個(gè)抽象層,讓用戶對(duì)日志的操作統(tǒng)一由Slf4j跟用戶去對(duì)接,用戶用這個(gè)抽象層的API來(lái)寫日志, 底層具體用什么日志工具實(shí)現(xiàn)用戶完全不用關(guān)心,由Slf4j來(lái)對(duì)接Log4j、LogBack 這些日志工具,這樣就可以更方便地移植了。

圖片

這個(gè)抽象層 Slf4j 就是Simple logging Facade For Java 的簡(jiǎn)稱,從名字里我們也能看出來(lái),它是一個(gè)外觀模式的實(shí)踐應(yīng)用,由于普及度很高,很多講解外觀模式的教程里都會(huì)提及它,拿它的實(shí)現(xiàn)來(lái)給讀者做分析。

總結(jié)

外觀模式的優(yōu)點(diǎn)

  • 簡(jiǎn)化了調(diào)用過(guò)程,不用深入了解子系統(tǒng),以防給子系統(tǒng)帶來(lái)風(fēng)險(xiǎn)。
  • 減少系統(tǒng)依賴,松散耦合。
  • 更好地劃分訪問(wèn)層次,提高了安全性。
  • 遵循迪米特法則

外觀模式的缺點(diǎn)

  • 當(dāng)增加子系統(tǒng)和擴(kuò)展子系統(tǒng)行為時(shí),需要對(duì)外觀進(jìn)行重復(fù)更改,不符合開閉原則,可能容易帶來(lái)未知風(fēng)險(xiǎn)。
責(zé)任編輯:武曉燕 來(lái)源: 網(wǎng)管叨bi叨
相關(guān)推薦

2014-01-02 10:34:54

設(shè)計(jì)設(shè)計(jì)師

2022-10-10 14:39:16

數(shù)字化轉(zhuǎn)型數(shù)據(jù)驅(qū)動(dòng)信息化

2010-01-21 09:08:53

.NET設(shè)計(jì)模式

2021-01-18 15:28:13

加密貨幣比特幣貨幣

2013-01-28 09:16:36

云存儲(chǔ)移動(dòng)數(shù)據(jù)混合存儲(chǔ)

2020-10-23 09:40:26

設(shè)計(jì)模式

2018-01-02 18:06:56

2020-02-20 10:50:30

多數(shù)人不會(huì)真正成功

2020-07-29 12:52:23

智慧城市城市數(shù)字

2022-02-15 22:45:00

前端設(shè)計(jì)模式

2012-03-18 18:56:58

iPad

2024-08-21 08:43:53

Python技巧鍵值

2021-02-25 23:31:50

加密貨幣比特幣貨幣

2018-04-27 16:00:15

Windows上帝模式

2023-02-14 06:40:33

React HookReact

2023-01-30 13:28:07

LinuxSteam Deck發(fā)行版

2021-03-18 15:33:22

設(shè)計(jì)模式外觀

2021-08-09 15:06:10

數(shù)字貨幣區(qū)塊鏈貨幣

2010-08-03 09:19:50

云計(jì)算調(diào)查

2025-03-28 10:21:50

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)