java中常用的6条设计模式及其设计原则

在Java中,设计模式是用于解决特定上下文中常见问题的最佳实践解决方案,广泛用于编写易于维护、扩展和理解的代码。这里我将介绍六种常用的设计模式及其对应的设计原则:

1. 单例模式 (Singleton)

设计原则: 确保一个类只有一个实例,并提供全局访问点。

应用场景: 当你需要确保系统中只有一个全局对象(如配置对象、连接池等)时使用。

示例代码:

public class Singleton {private static Singleton instance;private Singleton() {}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

2. 工厂方法模式 (Factory Method)

设计原则: 定义一个用于创建对象的接口,让子类决定实例化哪一个类。

应用场景: 当创建逻辑变得复杂或者客户端代码需要与产品对象解耦时使用。

示例代码:

public interface Product {void use();
}public class ConcreteProductA implements Product {public void use() {System.out.println("Product A used.");}
}public class ConcreteProductB implements Product {public void use() {System.out.println("Product B used.");}
}public abstract class Creator {public abstract Product factoryMethod();
}public class ConcreteCreatorA extends Creator {@Overridepublic Product factoryMethod() {return new ConcreteProductA();}
}public class ConcreteCreatorB extends Creator {@Overridepublic Product factoryMethod() {return new ConcreteProductB();}
}

3. 观察者模式 (Observer)

设计原则: 定义对象间的一种一对多的依赖关系,当一个对象的状态改变时,所有依赖于它的对象都会被自动通知和更新。

应用场景: 当你希望在系统中建立一个触发机制,比如用户操作触发某些响应或报告生成等。

示例代码:

import java.util.ArrayList;
import java.util.List;public interface Observer {void update();
}public class ConcreteObserver implements Observer {public void update() {System.out.println("Observer has been updated.");}
}public class Subject {private List<Observer> observers = new ArrayList<>();public void addObserver(Observer observer) {observers.add(observer);}public void removeObserver(Observer observer) {observers.remove(observer);}public void notifyObservers() {for (Observer observer : observers) {observer.update();}}
}

4. 装饰者模式 (Decorator)

设计原则: 对象应对扩展开放,但对修改关闭。动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

应用场景: 当你需要给类添加额外功能时,并希望在运行时动态地添加这些功能。

示例代码:

public interface Component {void operation();
}public class ConcreteComponent implements Component {public void operation() {System.out.println("Concrete Component operation.");}
}public abstract class Decorator implements Component {protected Component wrappedComponent;public Decorator(Component comp) {this.wrappedComponent = comp;}public void operation() {wrappedComponent.operation();}
}public class ConcreteDecoratorA extends Decorator {public ConcreteDecoratorA(Component comp) {super(comp);}public void operation() {super.operation();addedBehavior();}private void addedBehavior() {System.out.println("Concrete Decorator A behavior.");}
}

5. 策略模式 (Strategy)

设计原则: 定义算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

应用场景: 当你有多种类的算法或业务规则,并且这些算法需要在运行时根据不同情况动态更换时使用。

示例代码:

public interface Strategy {void execute();
}public class ConcreteStrategyA implements Strategy {public void execute() {System.out.println("Executing strategy A.");}
}public class ConcreteStrategyB implements Strategy {public void execute() {System.out.println("Executing strategy B.");}
}public class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public void setStrategy(Strategy strategy) {this.strategy = strategy;}public void executeStrategy() {strategy.execute();}
}

使用策略模式,可以方便地更改Context类实例的行为,通过为其设置不同的Strategy实现。

6. 适配器模式 (Adapter)

设计原则: 将一个类的接口转换成客户期望的另一个接口。适配器让原本由于接口不兼容而不能一起工作的那些类可以一起工作。

应用场景: 当你希望使用一个已存在的类,但其接口并不符合你的需求时,你可以创建一个适配器类来间接地适配其接口。

示例代码:

// 目标接口
public interface Target {void request();
}// 需要被适配的类
public class Adaptee {public void specificRequest() {System.out.println("Specific request.");}
}// 适配器
public class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void request() {adaptee.specificRequest();}
}

通过适配器模式,我们可以使原本因接口不兼容而无法一起工作的类可以一起工作。这种模式通过适配器类AdapterAdaptee类的接口转换为目标接口Target所期望的形式。

总结

这六种设计模式是Java中常用的模式,通过应用这些模式,可以提升代码的可维护性、扩展性和灵活性。设计模式遵循的设计原则,如开闭原则(开放扩展,关闭修改)、单一职责原则、依赖倒置原则等,都是在软件工程中保持代码健康的重要指导原则。掌握并应用这些设计模式和原则,有助于成为一名更优秀的软件工程师。

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

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

相关文章

linux下摄像头设置固定的设备名

目录 2.热插拔udev机制 3.设置udev的规则 1.查看usb ID 2. 查看usb设备的信息 3.编译规则 4.拓展 1.问题的出现 通过我之前的文章配置完摄像头的开机自启动之后我们会发现有的时候会出现启动不了的情况&#xff0c;通过实验我发现是摄像头的设备名发生了改变&#xff0c;…

ADSP-21479的开发详解五(AD1939 C Block-Based Talkthru 48 or 96 kHz)音频直通

硬件准备 ADSP-21479EVB开发板&#xff1a; 产品链接&#xff1a;https://item.taobao.com/item.htm?id555500952801&spma1z10.5-c.w4002-5192690539.11.151441a3Z16RLU AD-HP530ICE仿真器&#xff1a; 产品链接&#xff1a;https://item.taobao.com/item.htm?id38007…

leetcode821-Shortest Distance to a Character

题目 给你一个字符串 s 和一个字符 c &#xff0c;且 c 是 s 中出现过的字符。 返回一个整数数组 answer &#xff0c;其中 answer.length s.length 且 answer[i] 是 s 中从下标 i 到离它 最近 的字符 c 的 距离 。 两个下标 i 和 j 之间的 距离 为 abs(i - j) &#xff0c;其…

普通索引和唯一索引如何选择

查询过程 普通索引和唯一索引的性能差别不大。 因为引擎是按页读写的&#xff0c;按条件查询的话它所在的数据页就都在内存里了&#xff0c;即使普通索引还有其他的操作&#xff0c;但是我们计算平均性能差异时&#xff0c;仍可以认为这个操作成本对于现在的CPU来说可以忽略不计…

开源数据集分享——猫脸码客

开源数据集分享&#xff0c;让数据更自由流通——猫脸码客带你走进数据的新世界 在数字化时代的浪潮中&#xff0c;数据已经成为推动社会进步的重要力量。然而&#xff0c;数据的获取与利用往往受到种种限制&#xff0c;使得许多有价值的信息难以被充分挖掘。幸运的是&#xf…

linux下安装mysql和主从搭建_亲测成功

linux下安装mysql和主从搭建_亲测成功 linux下安装mysql yum list installed | grep mysql #查看系统中是否已安装mysql软件yum -y remove mysql-libs.x86_64 #删除mkdir -pv /data/softwarecd /data/software/wget http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.2…

适配器模式【结构型模式C++】

1.概述 适配器模式是一种结构型设计模式&#xff0c; 又称为变压器模式、包装模式&#xff08;Wrapper&#xff09; 将一个类的接口变换成客户端所期待的另一种接口&#xff0c;从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 2.结构 Target&#xff1a;适配…

Leetcode算法训练日记 | day31

专题九 贪心算法 一、分发饼干 1.题目 Leetcode&#xff1a;第 455 题 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的…

MongoDB的使用场景

MongoDB的使用场景 MongoDB 是一个流行的文档型 NoSQL 数据库&#xff0c;适用于处理结构灵活、快速变化的数据以及需要高性能、高可用性和水平扩展能力的应用场景。以下是 MongoDB 的主要使用场景&#xff1a; Web & Mobile Applications: 实时数据处理&#xff1a;Mongo…

【算法一则】矩阵置零 【矩阵】【空间复用】

题目 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&#xff1a; …

冰达ROS机器人快速使用指南

欢迎来到《冰达ROS机器人极简使用指南》 Q&#xff1a;这份教程适合谁&#xff1f; A&#xff1a;适合完全0基础新手&#xff0c;需要快速跑起来机器人的基本功能。也适合技术大佬需要快速的了解冰达ROS机器人的使用方法。 Q&#xff1a;这份教程内容很少&#xff0c;是不是…

c# 反射的应用

简述&#xff1a; 反射指程序可以访问、检测和修改它本身状态或行为的一种能力。 程序集包含模块&#xff0c;而模块包含类型&#xff0c;类型又包含成员。反射则提供了封装程序集、模块和类型的对象。 您可以使用使用反射获取类型&#xff0c;根据类型来动态创建对象&#…

机器学习基本流程

Jupyter Notebook 代码连接&#xff1a; machine_learning_demo machine_learning_ensembles Step 1: Imports and Configuration import pandas as pd import numpy as np import copy import json import pickle import joblib import lightgbm as lgb import optuna impor…

【24届数字IC秋招总结】正式批面试经验汇总8——豪威、大普微

文章目录 一、豪威-数字电路设计工程师1.1 面试问题二、大普微-数字验证工程师2.1 一面面试问题2.2 二面面试问题2.3 hr面试问题一、豪威-数字电路设计工程师 面试时间:9.6 1.1 面试问题 1、 logic能不能随机产生x和z,如何产生 2、 断言怎么写的,a为高b为高 3、 讲下项目…

数据结构——7.17.2 查找的基本概念、顺序查找和折半查找

7.1&7.2 查找的基本概念、顺序查找和折半查找 1. 基本概念 1. 关键字&#xff1a;数据元素中标识该元素的某个数据项的值&#xff0c;使用基于关键字的查找&#xff0c;查找结果应该是唯一的。2. 查找表的常见操作1. 查找符合条件的数据元素&#xff1a;查得快即可2. …

国产数据库实践:亚信安慧AntDB在DTC 2024展示创新实力

4月12至13日&#xff0c;我国数据库行业最具影响力的活动之一——第十三届『数据技术嘉年华』(DTC 2024) 在京成功举办&#xff0c;业内众多专家学者、技术领袖、各行业客户和实力厂商均到场参会。亚信安慧AntDB数据库总架构师洪建辉受邀参与“数据库一体化”专题论坛&#xff…

Stylus精讲:网页设计新境界【写作AI一键生成】

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

《HCIP-openEuler实验指导手册》1.1Apache安装与测试

一、安装httpd 查看软件仓库中apache版本列表 dnf provides http 安装apache dnf install -y httpd 二、启动http并测试 查看apache版本号 httpd -v 检查配置文件是否正确 httpd -t 启动并设置为开机启动 systemctl enable httpd --now 或 systemctl enable httpd syst…

Android--ConnectivityManager使用

一、前言 Android10之后官方废弃了通过WifiManager连接WIFI的方式&#xff0c;现在要使用ConnectivityManager连接WIFI 二、连接WIFI public class MainActivity extends AppCompatActivity {private static final String TAG"lkx";Overrideprotected void onCrea…

yolov8实战第七天——pyqt5-yolov8实现车牌识别系统(参考论文(约7000字)+环境配置+完整部署代码+代码使用说明+训练好的模型)

基于 pyqt5-yolov8实现车牌识别系统,包括图片车牌识别,视频车牌识别,视频流车牌识别。 效果展示(图片检测,检测到的内容添加到历史记录): 效果展示(视频检测,视频车辆只会添加一条记录,下文更多实际应用中的优化策略): 基于YOLOv8和PyQt5的车牌识别系统设计与…