编程中的智慧之设计模式三

深入探索设计模式:实际应用和优化策略

在前两篇文章中,我们详细探讨了创建型模式、结构型模式、行为模式和架构模式的基本概念及其在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中的实现。通过这些内容,能够更好地理解和应用设计模式,提高系统设计和开发能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/873220.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海豚调度器(DolphinScheduler)集群搭建详细笔记

海豚调度器集群搭建笔记 1.DolphinScheduler Cluster部署1.1 集群部署规划1.2 集群准备工作1.3 初始化数据库1.4 修改安装环境配置1.5 安装DolphinScheduler1.6 启停命令1.7 登录 DolphinScheduler UI 1.DolphinScheduler Cluster部署 分布式去中心化易扩展的工作流任务调度系…

CTF-Web习题:[HFCTF2021]Unsetme

题目链接&#xff1a;[HFCTF2021]Unsetme 解题思路 打开靶场发现是一段PHP源码 做一下代码审阅&#xff1a; <?php// Kickstart the framework $f3require(lib/base.php);//引入f3框架源码$f3->set(DEBUG,1);//f3对象设置DEBUG属性 if ((float)PCRE_VERSION<8.0)…

腾讯元宝上线“3D角色梦工厂”:快速生成专属3D角色!

7月16日&#xff0c;腾讯旗下大模型应用“腾讯元宝”上线“3D角色梦工厂”&#xff0c;允许用户通过上传一张五官清晰的正面头像&#xff0c;并选择不同的角色模板&#xff0c;迅速生成个人3D角色&#xff01; 技术特点 “3D角色梦工厂”将大模型生成技术与3D应用相结合&#…

JavaDS —— 二叉树

树的基本概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看 起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 树形结构中&#xff0c;子树之间不能有…

Pandas库学习之DataFrame.drop()函数

Pandas库学习之DataFrame.drop()函数 一、简介 DataFrame.drop 是 Pandas 库中一个非常实用的函数&#xff0c;用于删除 DataFrame 中的行或列。通过指定列名或行索引&#xff0c;可以灵活地从数据集中移除不需要的数据。这对于数据清洗和预处理非常有用。 二、语法和参数 D…

AWS IoT Core 优化分析:提升性能、安全性和成本效益

1. 引言 在当今快速发展的物联网(IoT)领域,AWS IoT Core已成为许多企业首选的IoT平台。然而,随着设备数量的增加和数据流量的激增,优化AWS IoT Core的性能、安全性和成本效益变得至关重要。本文将深入探讨如何通过数据分析来优化AWS IoT Core的各个方面,帮助您充分发挥这个强大…

02线性表 - 链表

这里是只讲干货不讲废话的炽念&#xff0c;这个系列的文章是为了我自己以后复习数据结构而写&#xff0c;所以可能会用一种我自己能够听懂的方式来描述&#xff0c;不会像书本上那么枯燥和无聊&#xff0c;且全系列的代码均是可运行的代码&#xff0c;关键地方会给出注释^_^ 全…

十六、【机器学习】【监督学习】- 支持向量回归 (SVR)

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…

Docker Ubuntu Milvus 2.4 windows 详细安装攻略

目录 背景 安装Docker Destop 下载docker 破解之法 启动 docker destop OS镜像 前置条件 dism 启动WSL服务 命令

MQTT 固定报头中的剩余长度介绍

MQTT协议中的剩余长度&#xff08;Remaining Length&#xff09;是一个重要的概念&#xff0c;它表示当前报文剩余部分的字节数&#xff0c;包括可变报头和负载的数据&#xff0c;但不包括用于编码剩余长度字段本身的字节数。以下是对MQTT剩余长度的详细说明&#xff1a; 一、…

python中excel的读取和写入

python中对于excel文件数据的读取和写入&#xff0c;主要有两种方法&#xff0c;一种是通过pandas库&#xff0c;一种是通过openpyxl库。在实际过程中&#xff0c;因为pandas库对单元格的定位和访问比较方便&#xff0c;openpyxl可以对单个单元格进行写入&#xff0c;而pandas库…

GaussDB常见调优指南

文章目录 GaussDB常见调优指南一. Analyze 统计信息解析二. Explain 分布式计划解析三. 性能调优总体策略详解四. 性能调优之坏味道 SQL 识别五. 性能调优之好味道表定义六. 性能调优之 SQL 改写七. 性能调优之路径干预八. 性能调优之 Plan hint 运用九. 性能调优之 GUC 参数调…

C学习(数据结构)-->单链表习题

目录 一、环形链表 题一&#xff1a;环形链表 思路&#xff1a; 思考一&#xff1a;为什么&#xff1f; 思考二&#xff1a;快指针一次走3步、4步、......n步&#xff0c;能否相遇 step1&#xff1a; step2&#xff1a; 代码&#xff1a; 题二&#xff1a; 环形链表 I…

SAE J1939协议入门(一)

一、SAE J1939是什么 SAE J1939&#xff08;以下简称J1939&#xff09;是由汽车工程师协会&#xff08;SAE &#xff09;定义的标准&#xff0c;专门用于提供微处理器系统之间的串行数据通信。虽然CAN存在并且被广泛用于小型车辆&#xff0c;但J1939被设计为大型车辆复杂网络的…

antd drawer extra中按钮点击事件获取子组件的数据

在Ant Design的Drawer组件中&#xff0c;需要在extra区域的按钮点击事件中获取子组件的数据&#xff0c;可以通过以下步骤实现&#xff1a; 使用useRef钩子在父组件中创建一个ref引用子组件。 在子组件中使用useImperativeHandle或forwardRef来暴露一个方法给父组件调用。 在ex…

android mm m mmm 区别

Android开发中的m, mm, mmm命令用于编译源代码&#xff0c;‌它们的主要区别在于编译的范围和目标。‌ m命令&#xff1a;‌用于从Android源码的根目录开始编译所有的模块。‌这个命令会编译整个Android源代码树&#xff0c;‌确保所有必要的模块都被编译12。‌ mm命令&#x…

如何用Java实现运营商三要素接口调用

今天给大家案例运营商三要素接口&#xff0c;该接口实用性极强&#xff01;建议大家点赞收藏&#xff0c;如果问题可随时评论区留言交流&#xff01; 一、什么是运营商三要素&#xff1f; 运营商三要素通常指的是手机号码、用户姓名和身份证号码。 二、运营商三要素应用场景…

升级TrinityCore 服务器硬件

升级服务器 原服务器&#xff1a;Ubuntu装VirtualBox装Ubuntu虚拟机 原配置&#xff1a;内存1756MB 内核4 外接硬盘 ip 192.168.0.12 升级服务器&#xff1a;FreeBSD装bhyve装Ubuntu虚拟机 新配置&#xff1a;内存3072MB 内核4 ssd硬盘 ip 192.168.1.12 除了ssh&#…

WPF之URI的使用

pack://application:, pack://application:, 是一个在 WPF (Windows Presentation Foundation) 应用程序中用于指定资源位置的 URI (统一资源标识符) 方案的特定格式。这个格式用于访问嵌入在应用程序程序集&#xff08;assemblies&#xff09;中的资源&#xff0c;如图像、XA…

深度挖掘行情接口:股票市场中的关键金融数据API接口解析

在股票市场里&#xff0c;存在若干常见的股票行情数据接口&#xff0c;每一种接口皆具备独特的功能与用途。以下为一些常见的金融数据 API 接口&#xff0c;其涵盖了广泛的金融数据内容&#xff0c;其中就包含股票行情数据&#xff1a; 实时行情接口 实时行情接口&#xff1a…