编程中的智慧之设计模式三
深入探索设计模式:实际应用和优化策略
在前两篇文章中,我们详细探讨了创建型模式、结构型模式、行为模式和架构模式的基本概念及其在Java中的实现。在本文中,我们将进一步探讨如何在实际项目中应用和优化这些模式,尤其是如何在大型系统中灵活运用设计模式,提高系统的扩展性、可维护性和可复用性。
组合模式(Composite Pattern)
组合模式允许你将对象组合成树形结构来表示“整体/部分”层次结构。组合能使客户以一致的方式处理单个对象和组合对象。
import java.util.ArrayList;
import java.util.List;// 组件接口
interface Component {void showDetails();
}// 叶子节点
class Employee implements Component {private String name;private String position;public Employee(String name, String position) {this.name = name;this.position = position;}@Overridepublic void showDetails() {System.out.println(name + " works as " + position);}
}// 组合节点
class Manager implements Component {private String name;private List<Component> subordinates;public Manager(String name) {this.name = name;this.subordinates = new ArrayList<>();}public void addSubordinate(Component component) {subordinates.add(component);}public void removeSubordinate(Component component) {subordinates.remove(component);}@Overridepublic void showDetails() {System.out.println("Manager: " + name);for (Component component : subordinates) {component.showDetails();}}
}// 客户端
public class CompositePatternDemo {public static void main(String[] args) {Employee emp1 = new Employee("John", "Developer");Employee emp2 = new Employee("Jane", "Designer");Manager manager = new Manager("Robert");manager.addSubordinate(emp1);manager.addSubordinate(emp2);manager.showDetails();}
}
中介者模式(Mediator Pattern)
中介者模式定义了一个对象来封装一组对象如何交互。中介者模式促进了松耦合,使得对象不需要显式地相互引用,从而使得它们可以独立变化。
import java.util.ArrayList;
import java.util.List;// 中介者接口
interface Mediator {void sendMessage(String message, Colleague colleague);
}// 具体中介者
class ConcreteMediator implements Mediator {private List<Colleague> colleagues;public ConcreteMediator() {this.colleagues = new ArrayList<>();}public void addColleague(Colleague colleague) {colleagues.add(colleague);}@Overridepublic void sendMessage(String message, Colleague colleague) {for (Colleague c : colleagues) {if (c != colleague) {c.receive(message);}}}
}// 同事类
abstract class Colleague {protected Mediator mediator;public Colleague(Mediator mediator) {this.mediator = mediator;}public abstract void receive(String message);public abstract void send(String message);
}// 具体同事类
class ConcreteColleague1 extends Colleague {public ConcreteColleague1(Mediator mediator) {super(mediator);}@Overridepublic void receive(String message) {System.out.println("Colleague1 received: " + message);}@Overridepublic void send(String message) {System.out.println("Colleague1 sends: " + message);mediator.sendMessage(message, this);}
}class ConcreteColleague2 extends Colleague {public ConcreteColleague2(Mediator mediator) {super(mediator);}@Overridepublic void receive(String message) {System.out.println("Colleague2 received: " + message);}@Overridepublic void send(String message) {System.out.println("Colleague2 sends: " + message);mediator.sendMessage(message, this);}
}// 客户端
public class MediatorPatternDemo {public static void main(String[] args) {Mediator mediator = new ConcreteMediator();Colleague colleague1 = new ConcreteColleague1(mediator);Colleague colleague2 = new ConcreteColleague2(mediator);((ConcreteMediator) mediator).addColleague(colleague1);((ConcreteMediator) mediator).addColleague(colleague2);colleague1.send("Hi, colleague2!");colleague2.send("Hello, colleague1!");}
}
实际项目中的设计模式应用策略
1. 识别模式应用的场景
在实际项目中,识别适当的设计模式应用场景非常重要。开发者需要熟悉不同设计模式的优缺点及其适用场景,以便在特定情况下选择最佳模式。例如,在需要动态改变对象行为时,策略模式(Strategy Pattern)是一种理想的选择;而在需要通过不同方式创建复杂对象时,建造者模式(Builder Pattern)则更为适用。
2. 组合使用多种模式
在实际开发中,往往需要组合使用多种设计模式。例如,MVC架构模式中,控制器可能使用命令模式来处理用户请求,视图可能使用观察者模式(Observer Pattern)来更新显示内容。通过组合使用多种模式,可以更好地满足系统的复杂需求,提高系统的扩展性和维护性。
3. 避免过度设计
尽管设计模式能解决许多软件设计问题,但过度使用设计模式可能导致系统过于复杂。因此,开发者应根据实际需求合理使用设计模式,避免为了使用模式而使用模式。在设计系统时,应遵循KISS原则(Keep It Simple, Stupid),确保系统设计简洁高效。
4. 持续学习和优化
设计模式并不是一成不变的,开发者应不断学习和探索新的设计模式,并结合实际项目进行优化。通过实践和总结,开发者可以更好地理解和应用设计模式,提升系统设计能力。
结论
设计模式提供了一种系统化的方法来解决常见的软件设计问题。在实际项目中,合理应用设计模式可以显著提高系统的可扩展性、可维护性和可复用性。通过深入理解设计模式的原理和应用场景,结合实际项目需求,开发者可以设计出高效、稳定的系统。
以上三篇博客通过理论与实践相结合的方式,详细介绍了设计模式的基本概念、应用场景及其在Java中的实现。通过这些内容,能够更好地理解和应用设计模式,提高系统设计和开发能力。
相关文章:
编程中的智慧之设计模式三
深入探索设计模式:实际应用和优化策略 在前两篇文章中,我们详细探讨了创建型模式、结构型模式、行为模式和架构模式的基本概念及其在Java中的实现。在本文中,我们将进一步探讨如何在实际项目中应用和优化这些模式,尤其是如何在大…...
《YOLOv10改进实战专栏》专栏介绍 专栏目录
《YOLOv10改进实战专栏》介绍及目录 YOLOv10官方仓库地址 专栏地址:点击跳转 专栏导航如下: 🎀基础入门篇🎀 万字长文,小白新手怎么开始做YOLO实验,从零开始教!整体思路在这里,科研指…...
Python酷库之旅-第三方库Pandas(030)
目录 一、用法精讲 79、pandas.Series.dtype属性 79-1、语法 79-2、参数 79-3、功能 79-4、返回值 79-5、说明 79-6、用法 79-6-1、数据准备 79-6-2、代码示例 79-6-3、结果输出 80、pandas.Series.shape属性 80-1、语法 80-2、参数 80-3、功能 80-4、返回值 …...
神经网络中的激活函数举例,它们各自的特点,以及哪个激活函数效果更好,为什么
sigmoid: \(\sigma(x)1/(1e^{-x})\); 优:将数值压缩到 0 1,导数为 \(\sigma(x)(1-\sigma(x))\) 好算。劣:输出均值非0(0.5),梯度消失(Gradient vanishing)每次…...
【树莓派3B+】控制引脚输出高低电平
前言一、安装RPI.GPIO库二、编写简单的输出高低电平的程序三、运行程序总结 前言 首先检查一下自己的板子有没有带库 我这个是有的。 ok,正式进入步骤 一、安装RPI.GPIO库 如果还没有安装RPi.GPIO库,可以通过以下命令在树莓派上安装: p…...
【Redis7】高阶篇
1 Redis单线程 VS 多线程(入门篇) 1.1 面试题 redis到底是单线程还是多线程? IO多路复用听说过吗? redis为什么快? 1.2 Redis为什么选择单线程? 1.2.1 是什么 这种问法其实并不严谨,为啥这么说呢? Redis的版本…...
在学习使用LabVIEW的过程中,需要注意哪些问题?
在学习使用LabVIEW的过程中,需要注意以下问题: 1. 基础知识 图形化编程思维: LabVIEW采用图形化编程方式,与传统的文本编程语言有很大不同,需要适应这种新的编程思维方式。数据流概念: 理解LabVIEW的核心数…...
网络编程-TCP/IP
网络概述 网络采用分而治之的方法设计,将网络的功能划分为不同的模块,以分层的形式有机组合在一起。 每层实现不同的功能,其内部实现方法对外部其他层次来说是透明的。每层向上层提供服务,同时使用下层提供的服务 网络体系结构…...
php在服务器上部署可视化运维工具详细列表
如果你的项目很小,可以用宝塔。但对于并发大的服务器管理,选择适合的工具非常重要。 目录 以下是一些免费且适合高并发管理的服务器管理工具推荐: 1Panel: Portainer: Webmin: Cockpit: …...
Linux中的文件夹作用
在Linux系统中,每个目录都有其特定的用途,下面我用大白话来解释一下各个主要目录的作用: / (根目录):这是Linux文件系统的起点,所有其他目录都是从这里延伸出去的。你可以把它想象成你家里的门厅,所有房间的…...
【C++】C++中的assign函数详解
目录 一.assign函数是什么 二.assign函数怎么用 一.assign函数是什么 在C中, assign 是 std::string 类的一个成员函数,用于给字符串对象赋值,可以替换字符串对象中的内容为另一个字符串或字符串的一部分。 std::string 的 assign 函…...
Hadoop3:MR程序的数据倾斜问题处理
一、数据倾斜 什么是数据倾斜? 学过Redis集群的都知道数据倾斜这个问题。 就是大量数据,分配不均匀的现象。 二、MR数据倾斜 1、怎么判断出现数据倾斜? 数据频率倾斜——某一个区域的数据量要远远大于其他区域。 数据大小倾斜——部分记…...
Mojo 编程语言简介
Mojo 是一种新兴的编程语言,旨在结合 Python 的易用性与 C 的高性能,特别是面向高性能计算、机器学习和系统编程等领域。Mojo 的设计目标是提供一种既具备高级语言灵活性,又能够高效运行的编程工具。 主要特性 高性能:通过高级编…...
【有效验证】解决SQLyog连接MYSQL的错误 1251 - Client does not support
目录 一、原因分析: 二、进入到mysql 三、查看当前加密方式 四、更改加密方式 五、查看是否成功 前言:使用一个开源软件使用sqlyog、navcat都报1251错误,网上都是提示升级客户端,还有一种就是修改mysql配置。本文就是修改配置…...
Keka for Mac v1.4.3 中文下载 解压/压缩工具
Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件,将其从左侧拖入右侧文件夹中,等待安装完毕2、应用程序显示软件图标,表示安装成功 三、运行测试1、打开软件2、文件访问权限修改3、访达扩展 安装完成!ÿ…...
springboot3.2 RedisCacheManager配置
1、启用并配置 添加 EnableCaching 注解 并配置 RedisCacheManager package config;import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.PropertyAccessor; import c…...
IP地址与MAC地址区别
MAC地址和IP地址是现代计算机网络中两个非常重要的概念,它们各自承担着不同的角色和功能。 MAC地址(Media Access Control Address) 一种物理地址,它是烧录在网卡或接口上的,具有全球唯一性,一般不能被改…...
Linux chmod 命令简介
在Linux中,chmod 命令用于改变文件或文件夹的访问权限。要改变一个文件夹及其内部所有文件和子文件夹的权限,您可以使用递归选项 -R。以下是一些常用的 chmod 命令示例: 给所有用户读、写和执行权限: chmod -R 777 /path/to/direc…...
【LeetCode】删除排序链表中的重复元素 II
目录 一、题目二、解法完整代码 一、题目 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 示例 1: 输入:head [1,2,3,3,4,4,5] 输出:[1,2,5] 示例 …...
Pandas使用 `iloc` 和 `loc` 常见用法汇总
文章目录 df.iloc 常见用法1. 获取特定行2. 获取特定列3. 获取特定的行和列4. 获取行切片5. 获取列切片6. 获取特定的行和列切片 df.loc 常见用法1. 获取特定行2. 获取特定列3. 获取特定的行和列4. 获取行切片5. 获取列切片6. 获取特定的行和列切片 示例代码 df.iloc 和 df.lo…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
java高级——高阶函数、如何定义一个函数式接口类似stream流的filter
java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用(Math::max) 2 函数接口…...
从0开始学习R语言--Day17--Cox回归
Cox回归 在用医疗数据作分析时,最常见的是去预测某类病的患者的死亡率或预测他们的结局。但是我们得到的病人数据,往往会有很多的协变量,即使我们通过计算来减少指标对结果的影响,我们的数据中依然会有很多的协变量,且…...
