網站首頁 編程語言 正文
說明:本文介紹設計模式中結構型設計模式中的,外觀模式;
親手下廚還是點外賣?
外觀模式屬于結構型的設計模式,關注類或對象的組合,所呈現出來的結構。以吃飯為例,在介紹外觀模式之前,通過這個例子,談談我對面向對象的理解。
吃飯,是一個功能,可以有兩種方式來實現,對應的正是面向過程和面向對象的思想。
第一種,自己買菜買工具(初始化變量),做飯(實現方法),吃飯(實現方法),洗碗賣工具(釋放內存空間);
第二種,點外賣(手機對象),做飯(店家對象),送外賣(外賣員對象),吃飯(顧客對象);
通過比較,就很容易理解兩種設計思想了。實際上就是實現功能的思路,一種是將功能分為一步一步,逐步實現(面向過程);一種是將屬性和行為封裝為對象,讓功能的實現在對象的交互中實現。
這兩種解題思路,沒有高低之分,也沒有哪種更優秀,殊途同歸。
外觀模式
以上面吃飯為例,面向對象設計,如下:
(Vegetables,蔬菜對象,提供蔬菜)
/**
* 蔬菜對象
*/
public class Vegetables {
public void provide() {
System.out.println("提供蔬菜");
}
}
(Cook,廚師對象,做飯)
/**
* 廚師
*/
public class Cook {
public void cook() {
System.out.println("做飯");
}
}
(用餐者對象,吃飯,吃完飯洗碗)
/**
* 食客
*/
public class Diners {
public void eat() {
System.out.println("吃飯");
}
public void wash() {
System.out.println("洗碗");
}
}
(Client,客戶端,演示吃飯功能)
/**
* 客戶端
*/
public class Client {
public static void main(String[] args) {
new Vegetables().provide();
new Cook().cook();
new Diners().eat();
new Diners().wash();
}
}
(執行結果)
通過上面的例子,我們可以看出,實現一個功能涉及到多個對象的配合,那為什么我們不把這些對象中對應的功能(方法)綁定到一起,合并成一個業務層面上的功能(吃飯)呢?
如下:
(EatFacede,吃飯外觀類,捆綁各個對象的方法,實現吃飯功能)
/**
* 吃飯外觀類
*/
public class EatFacede {
/**
* 蔬菜對象
*/
private Vegetables vegetables;
/**
* 廚師對象
*/
private Cook cook;
/**
* 食客對象
*/
private Diners diners;
public EatFacede() {
vegetables = new Vegetables();
cook = new Cook();
diners = new Diners();
}
/**
* 吃飯
*/
public void eat() {
vegetables.provide();
cook.cook();
diners.eat();
diners.wash();
}
}
(Client,客戶端,演示吃飯流程,只需要調用吃飯外觀類中的eat()方法即可)
/**
* 客戶端
*/
public class Client {
public static void main(String[] args) {
new EatFacede().eat();
}
}
(執行結果)
以上就是結構型設計模式中,外觀模式的內容。這種將繁多的對象方法合并到一起,實現一項“大功能”的思路與生活經驗非常貼合。例如開公司,公司的合伙人一邊有資金,一邊有技術,聚在一起開公司干大事。
另外,在三層框架開發中,Controller層只管調用Service層中的一個方法,而在Service層中,該方法內可能去調用了其他Bean對象的方法,最終才實現了本Service中的這個功能,這也是外觀模式的體現。
總結
本文參考《設計模式的藝術》、《秒懂設計模式》兩書
原文鏈接:https://blog.csdn.net/qq_42108331/article/details/134793988
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-11-15 基于Golang實現延遲隊列(DelayQueue)_Golang
- 2022-05-13 this.$route.params獲取不到
- 2022-07-07 Python數據分析之?Matplotlib?3D圖詳情_python
- 2022-12-07 python中的eval函數使用實例_python
- 2022-10-05 VScode中C++頭文件問題的終極解決方法詳析_C 語言
- 2023-05-08 Python中Generators教程的實現_python
- 2023-01-28 Flutter項目手勢運用及單獨指針消歧問題解決方案_Android
- 2023-04-26 React高級指引之Refs?and?the?DOM使用時機詳解_React
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支