Java中常见的设计模式及其实际应用

在软件开发中,设计模式是重要的指导原则,它们提供了解决特定问题的可重用方案。Java作为一种强大的编程语言,广泛应用了许多设计模式。让我们深入探讨几种常见的设计模式,并展示它们在实际Java应用中的用例。

1. 单例模式 (Singleton Pattern)
单例模式确保一个类只有一个实例,并提供一个全局访问点。

public class Singleton {private static Singleton instance;private Singleton() {} // 私有构造函数public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}// 在实际应用中的使用:
public class SingletonApp {public static void main(String[] args) {Singleton obj = Singleton.getInstance();// 使用obj进行操作}
}

2. 工厂模式 (Factory Pattern)
工厂模式用于创建对象,但将具体创建的逻辑封装在一个单独的类中。

interface Shape {void draw();
}class Circle implements Shape {@Overridepublic void draw() {System.out.println("画一个圆形");}
}class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("画一个矩形");}
}class ShapeFactory {public Shape getShape(String shapeType) {if (shapeType == null) {return null;} else if (shapeType.equalsIgnoreCase("CIRCLE")) {return new Circle();} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {return new Rectangle();}return null;}
}// 在实际应用中的使用:
public class FactoryPatternApp {public static void main(String[] args) {ShapeFactory shapeFactory = new ShapeFactory();Shape circle = shapeFactory.getShape("CIRCLE");circle.draw(); // 输出:画一个圆形Shape rectangle = shapeFactory.getShape("RECTANGLE");rectangle.draw(); // 输出:画一个矩形}
}

3. 观察者模式 (Observer Pattern)
观察者模式用于对象之间的一对多依赖关系,当一个对象状态改变时,其依赖对象会得到通知并自动更新。

import java.util.ArrayList;
import java.util.List;interface Observer {void update();
}class Subject {private List<Observer> observers = new ArrayList<>();private int state;public int getState() {return state;}public void setState(int state) {this.state = state;notifyAllObservers();}public void attach(Observer observer) {observers.add(observer);}public void notifyAllObservers() {for (Observer observer : observers) {observer.update();}}
}class BinaryObserver implements Observer {private Subject subject;public BinaryObserver(Subject subject) {this.subject = subject;this.subject.attach(this);}@Overridepublic void update() {System.out.println("Binary String: " + Integer.toBinaryString(subject.getState()));}
}// 在实际应用中的使用:
public class ObserverPatternApp {public static void main(String[] args) {Subject subject = new Subject();new BinaryObserver(subject);subject.setState(10); // 输出:Binary String: 1010}
}

4. 装饰器模式 (Decorator Pattern)
装饰器模式允许向现有对象动态地添加新功能,它是继承的替代方案。

interface Shape {void draw();
}class Circle implements Shape {@Overridepublic void draw() {System.out.println("画一个圆形");}
}class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("画一个矩形");}
}abstract class ShapeDecorator implements Shape {protected Shape decoratedShape;public ShapeDecorator(Shape decoratedShape) {this.decoratedShape = decoratedShape;}public void draw() {decoratedShape.draw();}
}class RedShapeDecorator extends ShapeDecorator {public RedShapeDecorator(Shape decoratedShape) {super(decoratedShape);}@Overridepublic void draw() {decoratedShape.draw();setRedBorder(decoratedShape);}private void setRedBorder(Shape decoratedShape) {System.out.println("边框颜色:红色");}
}// 在实际应用中的使用:
public class DecoratorPatternApp {public static void main(String[] args) {Shape circle = new Circle();Shape redCircle = new RedShapeDecorator(new Circle());Shape redRectangle = new RedShapeDecorator(new Rectangle());circle.draw(); // 输出:画一个圆形redCircle.draw();// 输出:// 画一个圆形// 边框颜色:红色redRectangle.draw();// 输出:// 画一个矩形// 边框颜色:红色}
}

5. 策略模式 (Strategy Pattern)
策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,使得算法可独立于使用它的客户而变化。

interface Strategy {int doOperation(int num1, int num2);
}class OperationAdd implements Strategy {public int doOperation(int num1, int num2) {return num1 + num2;}
}class OperationSubtract implements Strategy {public int doOperation(int num1, int num2) {return num1 - num2;}
}class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public int executeStrategy(int num1, int num2) {return strategy.doOperation(num1, num2);}
}// 在实际应用中的使用:
public class StrategyPatternApp {public static void main(String[] args) {Context context = new Context(new OperationAdd());System.out.println("10 + 5 = " + context.executeStrategy(10, 5));context = new Context(new OperationSubtract());System.out.println("10 - 5 = " + context.executeStrategy(10, 5));}
}

6. 原型模式 (Prototype Pattern)
原型模式用于创建对象的一种方式,通过复制现有对象来生成新对象,避免了构造函数的执行。

import java.util.HashMap;
import java.util.Map;abstract class Shape implements Cloneable {protected String type;abstract void draw();public String getType() {return type;}public Object clone() {Object clone = null;try {clone = super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return clone;}
}class Circle extends Shape {public Circle() {type = "Circle";}@Overridevoid draw() {System.out.println("画一个圆形");}
}class Rectangle extends Shape {public Rectangle() {type = "Rectangle";}@Overridevoid draw() {System.out.println("画一个矩形");}
}class ShapeCache {private static Map<String, Shape> shapeMap = new HashMap<>();public static Shape getShape(String shapeId) {Shape cachedShape = shapeMap.get(shapeId);return (Shape) cachedShape.clone();}public static void loadCache() {Circle circle = new Circle();circle.draw();shapeMap.put(circle.getType(), circle);Rectangle rectangle = new Rectangle();rectangle.draw();shapeMap.put(rectangle.getType(), rectangle);}
}// 在实际应用中的使用:
public class PrototypePatternApp {public static void main(String[] args) {ShapeCache.loadCache();Shape clonedShape1 = ShapeCache.getShape("Circle");System.out.println("Shape : " + clonedShape1.getType());Shape clonedShape2 = ShapeCache.getShape("Rectangle");System.out.println("Shape : " + clonedShape2.getType());}
}

7. 适配器模式 (Adapter Pattern)
适配器模式允许接口不兼容的类能够一起工作,将一个类的接口转换成客户希望的另一个接口。

interface MediaPlayer {void play(String audioType, String fileName);
}interface AdvancedMediaPlayer {void playVlc(String fileName);void playMp4(String fileName);
}class VlcPlayer implements AdvancedMediaPlayer {@Overridepublic void playVlc(String fileName) {System.out.println("Playing vlc file. Name: " + fileName);}@Overridepublic void playMp4(String fileName) {// do nothing}
}class Mp4Player implements AdvancedMediaPlayer {@Overridepublic void playVlc(String fileName) {// do nothing}@Overridepublic void playMp4(String fileName) {System.out.println("Playing mp4 file. Name: " + fileName);}
}class MediaAdapter implements MediaPlayer {AdvancedMediaPlayer advancedMusicPlayer;public MediaAdapter(String audioType) {if (audioType.equalsIgnoreCase("vlc")) {advancedMusicPlayer = new VlcPlayer();} else if (audioType.equalsIgnoreCase("mp4")) {advancedMusicPlayer = new Mp4Player();}}@Overridepublic void play(String audioType, String fileName) {if (audioType.equalsIgnoreCase("vlc")) {advancedMusicPlayer.playVlc(fileName);} else if (audioType.equalsIgnoreCase("mp4")) {advancedMusicPlayer.playMp4(fileName);}}
}class AudioPlayer implements MediaPlayer {MediaAdapter mediaAdapter;@Overridepublic void play(String audioType, String fileName) {if (audioType.equalsIgnoreCase("mp3")) {System.out.println("Playing mp3 file. Name: " + fileName);} else if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) {mediaAdapter = new MediaAdapter(audioType);mediaAdapter.play(audioType, fileName);} else {System.out.println("Invalid media. " + audioType + " format not supported");}}
}// 在实际应用中的使用:
public class AdapterPatternApp {public static void main(String[] args) {AudioPlayer audioPlayer = new AudioPlayer();audioPlayer.play("mp3", "beyond the horizon.mp3");audioPlayer.play("mp4", "alone.mp4");audioPlayer.play("vlc", "far far away.vlc");audioPlayer.play("avi", "mind me.avi");}
}

8. 桥接模式 (Bridge Pattern)
桥接模式将抽象部分与它的实现部分分离,以便两者能够独立地变化。

interface DrawAPI {void drawCircle(int radius, int x, int y);
}class RedCircle implements DrawAPI {@Overridepublic void drawCircle(int radius, int x, int y) {System.out.println("Drawing Circle[ color: red, radius: " + radius + ", x: " + x + ", y: " + y + "]");}
}class GreenCircle implements DrawAPI {@Overridepublic void drawCircle(int radius, int x, int y) {System.out.println("Drawing Circle[ color: green, radius: " + radius + ", x: " + x + ", y: " + y + "]");}
}abstract class Shape {protected DrawAPI drawAPI;protected Shape(DrawAPI drawAPI) {this.drawAPI = drawAPI;}public abstract void draw();
}class Circle extends Shape {private int x, y, radius;public Circle(int x, int y, int radius, DrawAPI drawAPI) {super(drawAPI);this.x = x;this.y = y;this.radius = radius;}public void draw() {drawAPI.drawCircle(radius, x, y);}
}// 在实际应用中的使用:
public class BridgePatternApp {public static void main(String[] args) {Shape redCircle = new Circle(100, 100, 10, new RedCircle());Shape greenCircle = new Circle(100, 100, 10, new GreenCircle());redCircle.draw();greenCircle.draw();}
}

9. 建造者模式 (Builder Pattern)
建造者模式用于构建复杂对象,将对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

class Meal {private String drink;private String mainCourse;private String side;public void setDrink(String drink) {this.drink = drink;}public void setMainCourse(String mainCourse) {this.mainCourse = mainCourse;}public void setSide(String side) {this.side = side;}public void showItems() {System.out.println("Drink: " + drink);System.out.println("Main Course: " + mainCourse);System.out.println("Side: " + side);}
}interface MealBuilder {void buildDrink();void buildMainCourse();void buildSide();Meal getMeal();
}class VegMealBuilder implements MealBuilder {private Meal meal = new Meal();public void buildDrink() {meal.setDrink("Water");}public void buildMainCourse() {meal.setMainCourse("Salad");}public void buildSide() {meal.setSide("Bread");}public Meal getMeal() {return meal;}
}class MealDirector {public Meal createMeal(MealBuilder mealBuilder) {mealBuilder.buildDrink();mealBuilder.buildMainCourse();mealBuilder.buildSide();return mealBuilder.getMeal();}
}// 在实际应用中的使用:
public class BuilderPatternApp {public static void main(String[] args) {MealBuilder vegMealBuilder = new VegMealBuilder();MealDirector mealDirector = new MealDirector();Meal meal = mealDirector.createMeal(vegMealBuilder);meal.showItems();}
}

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

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

相关文章

elementui loading自定义图标和字体样式

需求&#xff1a;页面是用了很多个loading&#xff0c;需要其中有一个字体大些&#xff08;具体到图标也一样的方法&#xff0c;换下类名就行&#xff09; 遇见的问题&#xff1a;改不好的话会影响其他的loading样式&#xff08;一起改变了&#xff09; 效果展示 改之前 改之…

使用conda管理Python虚拟环境

标题&#xff1a;使用conda管理Python虚拟环境 摘要&#xff1a;本文将介绍如何使用conda工具创建、查看和删除Python虚拟环境。通过使用conda&#xff0c;我们可以轻松地在不同的项目中使用不同的Python版本和依赖库&#xff0c;避免不同项目之间的冲突。 一、简介 Python是…

使用 Kafka 和 CDC 将数据从 MongoDB Atlas 流式传输到 SingleStore Kai

SingleStore 提供了变更数据捕获 (CDC) 解决方案&#xff0c;可将数据从 MongoDB 流式传输到 SingleStore Kai。在本文中&#xff0c;我们将了解如何将 Apache Kafka 代理连接到 MongoDB Atlas&#xff0c;然后使用 CDC 解决方案将数据从 MongoDB Atlas 流式传输到 SingleStore…

IDEA好用插件

CodeGlance Pro 右侧代码小地图 Git Commit Template git提交信息模板 IDE Eval Reset 无限试用IDEA Maven Helper 图形化展示Maven项 One Dark theme 好看的主题 SequenceDiagram 展示方法调用链 Squaretest 生成单元测试 Translation 翻译 Lombok lombok插件…

【开题报告】基于JavaWeb的年货销售系统的设计与实现

1.选题背景 年货销售是中国传统文化的一部分&#xff0c;也是中国人过年必备的习俗之一。随着互联网的发展&#xff0c;越来越多的人选择在网上购买年货&#xff0c;以节省时间和精力。为了满足人们对年货的购买需求&#xff0c;设计一个基于JavaWeb的年货销售系统具有重要意义…

leecode | 829连续整数求和

给一个整数n 求连续整数的和等于n 的个数 这道题 是一个数论的思想 解决思路&#xff1a; 数必须是连续的&#xff0c;可以转化成一个通用的公式&#xff0c;以101为例做一般性推导&#xff0c;&#xff1a; 101 &#xff1d; 101 &#xff1d; 50 &#xff0b; 51 &#xff1d…

AQS原来是这么设计的,泰裤辣!

缘起 每门编程语言基本都离不开并发问题&#xff0c;Java亦如此。谈到Java的并发就离不开Doug lea老爷子贡献的juc包&#xff0c;而AQS又是juc里面的佼佼者 因此今天就一起来聊聊AQS 概念 AQS是什么&#xff0c;这里借用官方的话 Provides a framework for implementing blo…

web3: 智能合约

目录 智能合约的历史什么是智能合约如何运作?智能合约的应用代币标准ERC-20什么是 ERC-20?功能ERC-20 代币接口ERC-721什么是 ERC-721?功能ERC-721 代币接口:ERC-165ERC-777什么是 ERC-777&

第11课 实现桌面与摄像头叠加

在上一节&#xff0c;我们实现了桌面捕获功能&#xff0c;并成功把桌面图像和麦克风声音发送给对方。在实际应用中&#xff0c;有时候会需要把桌面与摄像头图像叠加在一起发送&#xff0c;这节课我们就来看下如何实现这一功能。 1.备份与修改 备份demo10并修改demo10为demo11…

前端跨域问题的解决思路

目录 前言 跨域问题的解决思路 一般跨域的解决方案 前言 做了一个简单页面&#xff0c;做了一些数据埋点&#xff0c;想通过企业微信机器人来推送数据&#xff0c;遇到了一些问题&#xff0c;顺便记录下。 跨域问题的解决思路 由于是项目比较简单&#xff0c;直接使用了aj…

Sentinel整合OpenFeign

1、配置文件 feign:sentinel:enabled: true 2、 编写一个工厂类 import com.cart.cartservice.client.ItemClient; import com.cart.cartservice.entity.Item; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.openfeign.FallbackFactory; import org.sp…

《Effective C++》《Resource Management》

文章目录 13、term13:Use objects to manage resources14、term14:Think carefully about copying behavior in resource-managing classes15、term15:Provide access to raw resources in resource-managing classes法一&#xff1a; 使用智能指针的get进行显示转换法二&#…

Redis 连接 命令

目录 1.Redis Echo 命令 - 打印字符串简介语法可用版本: > 1.0.0返回值: 返回字符串本身。 示例 2.Redis Select 命令 - 切换到指定的数据库简介语法可用版本: > 1.0.0返回值: 总是返回 OK 。 示例 3.Redis Ping 命令 - 查看服务是否运行简介语法可用版本: > 1.0.0返回…

2024-2030年中国磁化率仪行业应用前景与投资价值评估分析报告

2024-2030年中国磁化率仪行业应用前景与投资价值评估分析报告 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 《报告编号》: BG471760 《出…

Apache 网页优化

目录 1.网页压缩与缓存 1.1 网页压缩 1. gzip 介绍 2. Http的压缩过程 3. Apache的压缩模块 4. mod_deflate模块 1.2 网页缓存 1. 配置 mod_expires 模块启用 2. 隐藏版本信息 2.1 配置Apache隐藏版本信息 2.2 Apache 防盗链 1. 配置防盗链 2.检查是否安装mod_re…

景联文科技GPT教育题库:AI教育大模型的强大数据引擎

GPT-4发布后&#xff0c;美国奥数队总教练、卡耐基梅隆大学数学系教授罗博认为&#xff0c;这个几乎是用“刷题”方式喂大的AI教育大模型的到来&#xff0c;意味着人类的刷题时代即将退出历史舞台。 未来教育将更加注重学生的个性化需求和多元化发展&#xff0c;借助GPT和AI教育…

你想过在 C++ 中使用契约和反射特性吗?

以下内容为本人的学习笔记&#xff0c;如需要转载&#xff0c;请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/fOEG22dQqKSpsZmk8z6w6g ISO/IEC C 技术委员会主持人 Herb Sutter 报告称&#xff0c;C26 将具有新的功能&#xff0c;包括契约和反射。 该委员会…

Java异常简单介绍

文章目录 1. 异常分类和关键字1.1 分类1.2 关键字 2. Error2.1 Error定义2.2 常见的Error2.2.1 VirtualMachineError2.2.2 ThreadDeath2.2.3 LinkageError2.2.4 AssertionError2.2.5 InternalError2.2.6 OutOfMemoryError2.2.6.1 OOM原因2.2.6.2 OutOfMemoryError会导致宕机吗 …

大创项目推荐 深度学习卫星遥感图像检测与识别 -opencv python 目标检测

文章目录 0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **深度学习卫星遥感图像检测与识别 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐…

LeetCode刷题--- 解码方法

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述动…