Java設計模式-通俗舉例

設計模式就像做菜的食譜,告訴我們遇到常見問題時該用什么"烹飪方法"。今天我就用最生活化的例子,帶大家輕松掌握23種設計模式的精髓。

一、創建型模式(5種):怎么"造東西"

1. 單例模式:公司的CEO

  • 問題:一個公司只需要一個CEO

  • 解決

public class CEO {private static CEO instance;private CEO() {}  // 防止外部newpublic static CEO getInstance() {if (instance == null) {instance = new CEO();}return instance;}
}
  • 生活類比:不管問多少個人"誰是CEO",得到的都是同一個人

2. 工廠方法:奶茶店點單

  • 問題:顧客不需要知道奶茶怎么做

  • 解決

interface MilkTea {void make();
}class BubbleTea implements MilkTea {public void make() { System.out.println("加珍珠"); }
}class MilkTeaShop {public MilkTea orderTea(String type) {if ("bubble".equals(type)) {return new BubbleTea();}// 其他口味...}
}
  • 生活類比:告訴店員要珍珠奶茶,店員幫你做好,你不用管制作過程

3. 抽象工廠:家具套裝

  • 問題:要買整套風格匹配的家具

  • 解決

interface FurnitureFactory {Chair createChair();Table createTable();
}class ModernFactory implements FurnitureFactory {public Chair createChair() { return new ModernChair(); }public Table createTable() { return new ModernTable(); }
}
  • 生活類比:買"北歐風"套裝,確保沙發、茶幾風格統一

4. 建造者模式:組裝電腦

問題:配電腦有很多可選配件,組合復雜
解決

class Computer {private String CPU;private String GPU;// 其他配件...// 建造者內部類public static class Builder {private String CPU;private String GPU;public Builder setCPU(String cpu) {this.CPU = cpu;return this;  // 返回Builder自己,實現鏈式調用}public Builder setGPU(String gpu) {this.GPU = gpu;return this;}public Computer build() {Computer computer = new Computer();computer.CPU = this.CPU;computer.GPU = this.GPU;return computer;}}
}// 使用
Computer myPC = new Computer.Builder().setCPU("i7").setGPU("RTX 3080").build();

生活類比:去電腦城配機,告訴老板:"我要i7CPU,3080顯卡,16G內存...",老板幫你組裝好整機

5.?原型模式:復印簡歷

問題:創建重復對象成本高
解決

class Resume implements Cloneable {private String name;private String experience;// 實現克隆方法public Resume clone() {try {return (Resume)super.clone();} catch (CloneNotSupportedException e) {return null;}}
}// 使用
Resume original = new Resume();
Resume copy = original.clone();

生活類比:復印簡歷原件,不用每次都手寫一份新的

二、結構型模式(7種):怎么"組裝東西"

1. 適配器:電源轉換插頭

  • 問題:中國插頭沒法用美國插座

  • 解決

class ChinesePlug {void charge() { System.out.println("中國插頭充電"); }
}interface AmericanSocket {void power();
}class Adapter implements AmericanSocket {private ChinesePlug plug;public Adapter(ChinesePlug plug) {this.plug = plug;}public void power() {plug.charge();}
}
  • 生活類比:轉換插頭讓不同標準的電器能工作

2. 裝飾器:給奶茶加料

  • 問題:想靈活添加珍珠、椰果等配料

  • 解決

abstract class MilkTea {abstract String getDescription();abstract double cost();
}class BubbleDecorator extends MilkTea {private MilkTea milkTea;public BubbleDecorator(MilkTea milkTea) {this.milkTea = milkTea;}public String getDescription() {return milkTea.getDescription() + "+珍珠";}public double cost() {return milkTea.cost() + 2.0;}
}
  • 生活類比:先要杯原味奶茶,再說"加珍珠","再加布丁"

3. 橋接模式:遙控器與電器

問題:遙控器要控制多種電器
解決

// 實現部分
interface Device {void turnOn();void turnOff();
}class TV implements Device {public void turnOn() { System.out.println("電視開機"); }public void turnOff() { System.out.println("電視關機"); }
}// 抽象部分
abstract class RemoteControl {protected Device device;public RemoteControl(Device device) {this.device = device;}abstract void power();
}class BasicRemote extends RemoteControl {public BasicRemote(Device device) {super(device);}public void power() {device.turnOn();}
}

生活類比:同一個遙控器可以控制電視、空調等不同電器

4. 組合模式:公司組織架構

問題:統一處理單個對象和對象集合
解決

interface Employee {void showDetails();
}class Developer implements Employee {private String name;public void showDetails() {System.out.println("開發員:" + name);}
}class Department implements Employee {private List<Employee> employees = new ArrayList<>();public void addEmployee(Employee e) {employees.add(e);}public void showDetails() {for (Employee e : employees) {e.showDetails();}}
}

生活類比:查看部門信息會自動展示所有成員信息

5. 享元模式:共享單車

問題:大量相似對象消耗內存
解決

class Bike {private String color;  // 內部狀態(可共享)private String rider;  // 外部狀態(不可共享)public Bike(String color) {this.color = color;}public void ride(String rider) {this.rider = rider;System.out.println(rider + "騎走" + color + "單車");}
}class BikeFactory {private static Map<String, Bike> pool = new HashMap<>();public static Bike getBike(String color) {if (!pool.containsKey(color)) {pool.put(color, new Bike(color));}return pool.get(color);}
}

生活類比:共享單車公司不會為每個用戶造新車,而是大家共用

6.? 代理模式:房產中介

問題:不想/不能直接訪問對象
解決

interface House {void sell();
}class Owner implements House {public void sell() {System.out.println("房主賣房");}
}class Agent implements House {private House house;public Agent(House house) {this.house = house;}public void sell() {System.out.println("中介帶看房");house.sell();System.out.println("中介收傭金");}
}

生活類比:通過中介買房,不用直接聯系房東

?

三、行為型模式(11種):怎么做事情

1. 觀察者:微信群通知

  • 問題:消息要實時通知所有群成員

  • 解決

class WeChatGroup {private List<Member> members = new ArrayList<>();public void addMember(Member m) {members.add(m);}public void notifyMembers(String msg) {for (Member m : members) {m.receive(msg);}}
}class Member {void receive(String msg) {System.out.println("收到消息:" + msg);}
}
  • 生活類比:群里發消息,所有成員手機都會響

2. 策略:出行導航

  • 問題:根據情況選擇不同路線

  • 解決

interface RouteStrategy {void buildRoute();
}class DrivingStrategy implements RouteStrategy {public void buildRoute() { System.out.println("開車路線"); }
}class WalkingStrategy implements RouteStrategy {public void buildRoute() { System.out.println("步行路線"); }
}class Navigator {private RouteStrategy strategy;public void setStrategy(RouteStrategy s) {this.strategy = s;}public void execute() {strategy.buildRoute();}
}
  • 生活類比:高德地圖可以切換"駕車"、"步行"等不同導航模式

3. 責任鏈模式:審批流程

問題:請求需要多級處理
解決

abstract class Approver {protected Approver next;public void setNext(Approver next) {this.next = next;}abstract void processRequest(int amount);
}class Manager extends Approver {public void processRequest(int amount) {if (amount <= 1000) {System.out.println("經理批準");} else if (next != null) {next.processRequest(amount);}}
}class CEO extends Approver {public void processRequest(int amount) {System.out.println("CEO批準");}
}// 使用
Approver chain = new Manager();
chain.setNext(new CEO());
chain.processRequest(5000);  // CEO批準

生活類比:報銷流程,金額小的組長批,大的要經理批

4. 命令模式:餐廳點餐

問題:將請求封裝為對象
解決

interface Command {void execute();
}class OrderCommand implements Command {private Chef chef;private String dish;public OrderCommand(Chef chef, String dish) {this.chef = chef;this.dish = dish;}public void execute() {chef.cook(dish);}
}class Waiter {private List<Command> orders = new ArrayList<>();public void takeOrder(Command cmd) {orders.add(cmd);}public void placeOrders() {for (Command cmd : orders) {cmd.execute();}}
}

生活類比:服務員記下訂單(命令對象),后廚按訂單做菜

5. 迭代器模式:電視頻道切換

問題:統一遍歷不同集合
解決

interface ChannelIterator {boolean hasNext();String next();
}class TVChannelList {private String[] channels = {"CCTV1", "CCTV5", "HunanTV"};public ChannelIterator iterator() {return new ConcreteIterator();}private class ConcreteIterator implements ChannelIterator {private int position;public boolean hasNext() {return position < channels.length;}public String next() {return channels[position++];}}
}

生活類比:用遙控器上下鍵切換頻道,不用知道頻道如何存儲

6. 中介者模式:機場塔臺

問題:對象間直接交互復雜
解決

class Airplane {private ControlTower tower;public void requestLanding() {tower.requestLanding(this);}
}class ControlTower {public void requestLanding(Airplane plane) {System.out.println("允許降落");}
}

生活類比:飛機不直接溝通,都通過塔臺協調

7. 備忘錄模式:游戲存檔

問題:需要保存和恢復對象狀態
解決

class Game {private int level;public GameMemento save() {return new GameMemento(level);}public void load(GameMemento memento) {this.level = memento.getLevel();}
}class GameMemento {private final int level;public GameMemento(int level) {this.level = level;}public int getLevel() {return level;}
}

生活類比:游戲存檔讀檔功能

8. 狀態模式:紅綠燈切換

問題:對象行為隨狀態改變
解決

interface TrafficLightState {void handle();
}class RedLight implements TrafficLightState {public void handle() {System.out.println("紅燈停");}
}class TrafficLight {private TrafficLightState state;public void setState(TrafficLightState state) {this.state = state;}public void change() {state.handle();}
}

生活類比:交通燈自動按紅→綠→黃變化

9. 模板方法模式:沖泡飲料

問題:固定流程中的步驟變化
解決

abstract class Beverage {// 模板方法(固定流程)final void prepare() {boilWater();brew();pourInCup();addCondiments();}abstract void brew();abstract void addCondiments();void boilWater() {System.out.println("燒水");}void pourInCup() {System.out.println("倒入杯子");}
}class Coffee extends Beverage {void brew() { System.out.println("沖泡咖啡"); }void addCondiments() { System.out.println("加糖和牛奶"); }
}

生活類比:泡茶和泡咖啡步驟類似,但具體操作不同

10. 訪問者模式:醫生問診

問題:對一組對象執行多種操作
解決

interface Patient {void accept(Doctor visitor);
}class ChildPatient implements Patient {public void accept(Doctor visitor) {visitor.visit(this);}
}interface Doctor {void visit(ChildPatient patient);void visit(AdultPatient patient);
}class Pediatrician implements Doctor {public void visit(ChildPatient patient) {System.out.println("檢查兒童生長發育");}public void visit(AdultPatient patient) {System.out.println("成人不看兒科");}
}

生活類比:不同專科醫生對病人做不同檢查

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93216.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93216.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93216.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【跟我學YOLO】YOLO12(3)訓練自己的數據集

歡迎關注『跟我學 YOLO』系列 【跟我學YOLO】&#xff08;1&#xff09;YOLO12&#xff1a;以注意力為中心的物體檢測 【跟我學YOLO】&#xff08;2&#xff09;YOLO12 環境配置與基本應用 【跟我學YOLO】&#xff08;3&#xff09;YOLO12 訓練自己的數據集 【跟我學YOLO】&…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 微博輿情分析實現

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解微博輿情分析實現 視頻在線地址&#xff1…

【C++】手搓一個STL風格的vector容器

TOC(手搓一個STL風格的vector容器) 手搓一個STL風格的vector容器 github地址 有夢想的電信狗 0. 前言&#xff1a;動態數組的工程實踐 ? 在C標準庫中&#xff0c;vector容器作為最核心的序列式容器&#xff0c;其設計融合了動態數組的高效性與安全性。本文將通過完整實現…

24. 了解過 webp 嗎

總結 一種圖片格式 一、什么是 WebP&#xff1f; WebP&#xff08;發音為 “weppy”&#xff09;是由 Google 推出的一種現代圖片格式&#xff0c;支持有損壓縮和無損壓縮&#xff0c;旨在提供更小的文件體積和更高質量的圖像顯示。 它兼容常見的圖片功能&#xff0c;如&#…

【Unity筆記】Unity Camera.cullingMask 使用指南:Layer 精準控制、XR 多視圖與性能提升

Unity Camera.cullingMask 使用指南&#xff1a;Layer 精準控制、XR 多視圖與性能提升 關鍵詞&#xff1a;Unity、Camera、Culling Mask、Layer 控制、XR 渲染分離、UI 顯隱、性能優化 特別說明&#xff1a; 本文為近期項目所遇問題的總結&#xff0c;僅純文字記錄&#xff0c;…

攜帶參數的表單文件上傳 axios, SpringBoot

頁面上的表單如上圖, 點擊確定按鈕需要把參數統一傳給后端.前端代碼:表單的提交方法const submit async () > {const formData new FormData();formData.append("bookName", bookForm.value.bookName);formData.append("author", bookForm.value.auth…

黑馬JavaWeb【復習到哪更新到哪】

登錄認證&#xff08;復習Javaweb的登錄校驗&#xff09; 登錄功能 思路就是loginController->service層->mapper層&#xff0c;從數據庫中查找username和password是否和前端用戶提交的表單內容一致&#xff0c;一致就登錄成功&#xff0c;否則就返回登錄失敗的信息。 登…

NVMe高速傳輸之擺脫XDMA設計21:PCIe請求模塊設計(下)

在接收到請求總線接口的請求事務后&#xff0c;當請求類型的值為0時&#xff0c;表示通過PCIE硬核的配置管理接口發送請求&#xff0c;由于請求接口的接口和時序與配置管理接口基本一致&#xff0c;因此此時直接將請求接口信號驅動到配置管理接口完成請求的發送&#xff0c;請求…

機器學習sklearn:不純度與決策樹構建

不純度與決策樹構建不純度概念&#xff1a;決策樹通過不純度指標來選擇最佳分割節點和分枝方式不純度衡量節點中樣本類別的混雜程度不純度越低&#xff0c;節點中樣本類別越純凈&#xff0c;擬合效果越好常用不純度指標&#xff1a;信息熵(Entropy)&#xff1a;基于信息論的概念…

rk356x IR紅外發射與接收之NEC協議

紅外接收紅外接收頭解碼器&#xff08;紅外信號解碼&#xff0c;主要是NEC解碼&#xff09;紅外發射器紅外發光二極管晶振NEC編碼組成共32位&#xff08;4bit&#xff09;&#xff1a;由8位用戶碼1 8位用戶碼2 8位命令碼 8位命令碼反碼有時會存在按鍵一直按下的一幀信息&…

C++算法之單調棧

C算法中的單調棧&#xff1a;從入門到實戰指南 大家好&#xff01;今天我們來聊聊C算法中一個超級實用的工具——單調棧。別被名字嚇到&#xff0c;它其實很簡單&#xff0c;就像排隊買奶茶一樣&#xff1a;隊伍總是從矮到高&#xff08;或從高到矮&#xff09;排得整整齊齊&a…

React入門指南——指北指南(第二節)

React 實踐:創建你的第一個待辦事項列表 在前面的章節中,我們學習了 React 的核心概念(組件、Props、State 等)。本節將通過一個實際案例——創建待辦事項列表(Todo List),幫助你鞏固這些概念,并掌握 React 中處理用戶交互、動態數據的基本方法。 案例目標 我們將構…

WAIC看點:可交付AI登場,場景智能、專屬知識將兌現下一代AI價值

7月28日&#xff0c;為期三天的2025世界人工智能大會&#xff08;WAIC 2025&#xff09;在上海落下帷幕。作為全球 AI 領域最受關注的盛會之一&#xff0c;今年 WAIC 聚焦 AI 關鍵命題&#xff0c;圍繞大模型與智能體應用、算力新基建及大數據、智能終端與具身智能、AI金融、AI…

設計模式(十一)結構型:外觀模式詳解

設計模式&#xff08;十一&#xff09;結構型&#xff1a;外觀模式詳解外觀模式&#xff08;Facade Pattern&#xff09;是 GoF 23 種設計模式中的結構型模式之一&#xff0c;其核心價值在于為一個復雜的子系統提供一個統一、簡化的高層接口&#xff0c;從而降低客戶端與子系統…

接口測試核心概念與實踐指南

核心概念什么是接口&#xff1f;軟件不同部分之間進行通信和數據交換的約定或契約。定義了&#xff1a;請求方 (Client/Consumer) 如何調用&#xff08;方法、URL、參數&#xff09;。提供方 (Server/Provider) 如何響應&#xff08;數據結構、狀態碼&#xff09;。雙方需要遵循…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 熱詞數量分析日期統計功能實現

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解熱詞數量分析日期統計功能實現 視頻在線地…

ICPC 2024 網絡賽(I)

M. Find the Easiest Problem 題目大意 給定所有的提交記錄&#xff0c;找到通過隊伍最多且字典序最小的題目。 解題思路 按題意模擬即可 代碼實現 #include <bits/stdc.h>using i64 long long;int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std…

【快捷指令】ios/macos快捷指令如何調用api接口(json請求例子)

一、步驟 之前已經寫了一個【n8n】使用 n8n 創建插入數據到mysql的api&#xff08;圖解步驟&#xff09;博客,感興趣的可以看一下. 流程&#xff1a; 快捷指令調用api—開源工作流n8n上設置個快速寫數據庫的工作流 這樣就實現了記錄體重的一個快捷指令 二、步驟說明 1、…

「源力覺醒 創作者計劃」_文心大模型4.5系列開源模型,意味著什么?對開發者、對行業生態有何影響?

前言&#xff1a;哈嘍&#xff0c;大家好&#xff0c;今天給大家分享一篇文章&#xff01;并提供具體代碼幫助大家深入理解&#xff0c;徹底掌握&#xff01;創作不易&#xff0c;如果能幫助到大家或者給大家一些靈感和啟發&#xff0c;歡迎收藏關注哦 &#x1f495; 目錄「源力…

CanMV-K230 AI學習筆記系列

在學習了一段時間CanMV-K230后&#xff0c;感覺雖然可以直接調用復雜的模型&#xff0c;但是很多環節不是很明白&#xff0c;因此希望能夠從基礎的模型開始逐漸深入學習。 下面為已經完成的一些筆記及計劃&#xff1a; 1 CanMV K230使用經驗分享 這個是剛開始學習K230時&#…