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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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时&#…