JAVA的设计模式都有那些

        Java设计模式是为了解决软件开发中常见的问题而创建的一系列最佳实践。它们提供了一种在特定情境下解决问题的方法论,并且已经被广泛验证和应用。这些模式不是具体的代码,而是关于如何组织代码以达到某种目的的高层次描述。设计模式通常分为三大类:创建型模式、结构型模式和行为型模式。

一  创建型模式

这类模式主要处理对象的创建方式,目的是将系统与具体类解耦。

       1. 单例模式 (Singleton Pattern)

                 确保一个类只有一个实例,并提供一个全局访问点。例如,数据库连接池或日志记录器。

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 Pattern)

                定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

interface Product { void use(); }class ConcreteProduct implements Product { public void use() {} }abstract class Creator {public final Product create(String type) {Product product = factoryMethod(type);// 准备、初始化等return product;}protected abstract Product factoryMethod(String type);
}class ConcreteCreator extends Creator {protected Product factoryMethod(String type) {if ("A".equals(type)) {return new ConcreteProduct();} else {throw new IllegalArgumentException("Invalid product type");}}
}

       3. 抽象工厂模式 (Abstract Factory Pattern)

                提供一个接口来创建一系列相关或相互依赖的对象,而无需指定它们的具体类。

interface AbstractFactory {ProductA createProductA();ProductB createProductB();
}class ConcreteFactory1 implements AbstractFactory {public ProductA createProductA() { return new ConcreteProductA1(); }public ProductB createProductB() { return new ConcreteProductB1(); }
}// 其他产品和工厂实现...

       4. 建造者模式 (Builder Pattern)

                将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。

class Product {// 复杂对象属性
}interface Builder {void buildPartA();void buildPartB();Product getResult();
}class ConcreteBuilder implements Builder {private Product product = new Product();public void buildPartA() { /* 构建部分A */ }public void buildPartB() { /* 构建部分B */ }public Product getResult() { return product; }
}class Director {private Builder builder;public Director(Builder builder) { this.builder = builder; }public void construct() {builder.buildPartA();builder.buildPartB();}
}

       5. 原型模式 (Prototype Pattern)

                通过复制现有实例来创建新实例,而不是通过构造函数创建。

interface Prototype {Prototype clone();
}class ConcretePrototype implements Prototype, Cloneable {@Overridepublic Prototype clone() {try {return (ConcretePrototype) super.clone();} catch (CloneNotSupportedException e) {throw new AssertionError();}}
}

二  结构型模式

         结构型模式关注于如何组合类和对象以形成更大的结构,同时保持结构的灵活性和高效性。

       1. 适配器模式 (Adapter Pattern)

                允许不兼容接口的对象能够一起工作。

interface Target {void request();
}class Adaptee {void specificRequest() {}
}class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) { this.adaptee = adaptee; }public void request() { adaptee.specificRequest(); }
}

       2. 桥接模式 (Bridge Pattern)

                将抽象部分与它的实现部分分离,使它们都可以独立地变化。

interface Implementor {void operationImpl();
}class ConcreteImplementorA implements Implementor {public void operationImpl() { /* 实现细节 */ }
}abstract class Abstraction {protected Implementor implementor;public void setImplementor(Implementor implementor) {this.implementor = implementor;}public abstract void operation();
}class RefinedAbstraction extends Abstraction {public void operation() {implementor.operationImpl();}
}

       3. 装饰器模式 (Decorator Pattern)

                动态地给一个对象添加一些额外的职责。

interface Component {void operation();
}class ConcreteComponent implements Component {public void operation() { /* 基本功能 */ }
}abstract class Decorator implements Component {protected Component component;public Decorator(Component component) {this.component = component;}public void operation() {component.operation();}
}class ConcreteDecoratorA extends Decorator {public ConcreteDecoratorA(Component component) { super(component); }public void addedBehavior() { /* 额外的行为 */ }public void operation() {super.operation();addedBehavior();}
}

       4. 外观模式 (Facade Pattern)

                提供了一个统一的接口,用来访问子系统中的一群接口。

class Subsystem1 { public void operation1() {} }
class Subsystem2 { public void operation2() {} }
class Subsystem3 { public void operation3() {} }class Facade {private Subsystem1 subsystem1;private Subsystem2 subsystem2;private Subsystem3 subsystem3;public Facade() {subsystem1 = new Subsystem1();subsystem2 = new Subsystem2();subsystem3 = new Subsystem3();}public void operation() {subsystem1.operation1();subsystem2.operation2();subsystem3.operation3();}
}

       5. 享元模式 (Flyweight Pattern)

                用于减少创建对象的数量,以减少内存占用并提高性能。

interface Flyweight {void operation(int extrinsicState);
}class ConcreteFlyweight implements Flyweight {private int intrinsicState;public ConcreteFlyweight(int intrinsicState) {this.intrinsicState = intrinsicState;}public void operation(int extrinsicState) {System.out.println("Intrinsic State: " + intrinsicState + ", Extrinsic State: " + extrinsicState);}
}class FlyweightFactory {private Map<Integer, ConcreteFlyweight> flyweights = new HashMap<>();public Flyweight getFlyweight(int key) {if (!flyweights.containsKey(key)) {flyweights.put(key, new ConcreteFlyweight(key));}return flyweights.get(key);}
}

       6. 代理模式 (Proxy Pattern)

                为其他对象提供一种代理以控制对这个对象的访问。

interface Subject {void request();
}class RealSubject implements Subject {public void request() { /* 实际操作 */ }
}class Proxy implements Subject {private RealSubject realSubject;public void request() {if (realSubject == null) {realSubject = new RealSubject();}preRequest();realSubject.request();postRequest();}private void preRequest() { /* 在请求前执行的操作 */ }private void postRequest() { /* 在请求后执行的操作 */ }
}

       7. 组合模式 (Composite Pattern)

                允许你将对象组合成树形结构来表示“部分-整体”的层次结构。

interface Component {void add(Component c);void remove(Component c);void display(int depth);
}class Leaf implements Component {public void add(Component c) { throw new UnsupportedOperationException(); }public void remove(Component c) { throw new UnsupportedOperationException(); }public void display(int depth) { for (int i = 0; i < depth; i++) { System.out.print("-"); } System.out.println("Leaf"); }
}class Composite implements Component {private List<Component> children = new ArrayList<>();public void add(Component c) { children.add(c); }public void remove(Component c) { children.remove(c); }public void display(int depth) {for (int i = 0; i < depth; i++) { System.out.print("-"); }System.out.println("+ Composite");for (Component child : children) {child.display(depth + 1);}}
}

三  行为型模式

         行为型模式涉及对象之间的通信和协作,以及分配责任和算法的方式。

       1. 策略模式 (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 Context {private Strategy strategy;public Context(Strategy strategy) { this.strategy = strategy; }public int executeStrategy(int num1, int num2) {return strategy.doOperation(num1, num2);}
}

       2. 观察者模式 (Observer Pattern)

                当一个对象的状态改变时,所有依赖它的对象都会收到通知并自动更新。

interface Observer {void update(String message);
}interface Subject {void attach(Observer observer);void detach(Observer observer);void notifyObservers(String message);
}class ConcreteSubject implements Subject {private List<Observer> observers = new ArrayList<>();public void attach(Observer observer) { observers.add(observer); }public void detach(Observer observer) { observers.remove(observer); }public void notifyObservers(String message) {for (Observer observer : observers) {observer.update(message);}}
}class ConcreteObserver implements Observer {public void update(String message) { System.out.println("Received: " + message); }
}

       3. 命令模式 (Command Pattern)

                将请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化。

interface Command {void execute();
}class ConcreteCommand implements Command {private Receiver receiver;public ConcreteCommand(Receiver receiver) { this.receiver = receiver; }public void execute() { receiver.action(); }
}class Receiver {public void action() { /* 执行实际动作 */ }
}class Invoker {private Command command;public void setCommand(Command command) { this.command = command; }public void executeCommand() { command.execute(); }
}

       4. 状态模式 (State Pattern)

                允许一个对象在其内部状态改变时改变其行为。

interface State {void handle(Context context);
}class ConcreteStateA implements State {public void handle(Context context) {context.setState(new ConcreteStateB());System.out.println("Switch to State B");}
}class ConcreteStateB implements State {public void handle(Context context) {context.setState(new ConcreteStateA());System.out.println("Switch to State A");}
}class Context {private State state;public Context(State state) { this.state = state; }public void setState(State state) { this.state = state; }public void request() { state.handle(this); }
}

       5. 模板方法模式 (Template Method Pattern)

                定义了一个算法的骨架,而将一些步骤延迟到子类中。

abstract class AbstractClass {public final void templateMethod() {primitiveOperation1();primitiveOperation2();}protected abstract void primitiveOperation1();protected abstract void primitiveOperation2();
}class ConcreteClass extends AbstractClass {protected void primitiveOperation1() { /* 实现操作1 */ }protected void primitiveOperation2() { /* 实现操作2 */ }
}

       6. 中介者模式 (Mediator Pattern)

                 用一个中介对象来封装一系列的对象交互。

interface Mediator {void notify(Object sender, String ev);
}class ConcreteMediator implements Mediator {private Component1 component1;private Component2 component2;public ConcreteMediator(Component1 c1, Component2 c2) {this.component1 = c1;this.component2 = c2;}public void notify(Object sender, String ev) {if (ev.equals("A")) {component2.doC();} else if (ev.equals("D")) {component1.doB();}}
}class Component1 {private Mediator mediator;public Component1(Mediator mediator) { this.mediator = mediator; }public void doA() { mediator.notify(this, "A"); }public void doB() { System.out.println("Doing B"); }
}class Component2 {private Mediator mediator;public Component2(Mediator mediator) { this.mediator = mediator; }public void doC() { System.out.println("Doing C"); }public void doD() { mediator.notify(this, "D"); }
}

       7. 迭代器模式 (Iterator Pattern)

                提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。

interface Iterator {boolean hasNext();Object next();
}interface Container {Iterator getIterator();
}class NameRepository implements Container {public String names[] = {"Robert", "John", "Julie", "Lora"};public Iterator getIterator() {return new NameIterator();}private class NameIterator implements Iterator {int index;public boolean hasNext() {if (index < names.length) {return true;}return false;}public Object next() {if (this.hasNext()) {return names[index++];}return null;}}
}

       8. 访问者模式 (Visitor Pattern)

                在不改变数据结构的前提下,增加作用于一组对象元素的新功能。

interface Element {void accept(Visitor v);
}interface Visitor {void visitConcreteElementA(ConcreteElementA a);void visitConcreteElementB(ConcreteElementB b);
}class ConcreteElementA implements Element {public void accept(Visitor v) { v.visitConcreteElementA(this); }public void operationA() { /* 操作A */ }
}class ConcreteElementB implements Element {public void accept(Visitor v) { v.visitConcreteElementB(this); }public void operationB() { /* 操作B */ }
}class ConcreteVisitor1 implements Visitor {public void visitConcreteElementA(ConcreteElementA a) { a.operationA(); }public void visitConcreteElementB(ConcreteElementB b) { b.operationB(); }
}class ConcreteVisitor2 implements Visitor {public void visitConcreteElementA(ConcreteElementA a) { a.operationA(); }public void visitConcreteElementB(ConcreteElementB b) { b.operationB(); }
}

        以上只是每种设计模式的一个简单示例。在实际开发过程中,你需要根据具体的需求和场景选择合适的设计模式。设计模式不仅帮助解决常见问题,还促进了代码复用、增强了程序的可维护性和扩展性。理解并熟练运用这些模式,可以帮助开发者编写出更加优雅和高效的代码。

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

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

相关文章

学Linux的第五天

目录 命令解释器-shell-负责解析用户输入的命令 分类&#xff1a; type --查看命令是内置命令、外置命名、alias命令 注意 Linux 中的特殊符号 拓展 命令别名aliasalias 别名原命令 - 参数 常用的别名untar&#xff0c;wget,getpass,ping,speed,ipe,c 删除别名unalias…

谷歌被俄罗斯罚款2,500,000,000,000,000,000,000,000,000,000,000,000美元

是的&#xff01;小鹿没有写错&#xff01;你们也没有看错&#xff01; 谷歌被俄罗斯法院判决罚款$2,500,000,000,000,000,000,000,000,000,000,000,000&#xff08;注意不是卢布&#xff0c;是美元&#xff09;&#xff0c;也就是2.5万亿万亿万亿亿&#xff0c;共计36位数的罚…

Spring Cloud Sleuth(Micrometer Tracing +Zipkin)

分布式链路追踪 分布式链路追踪技术要解决的问题&#xff0c;分布式链路追踪&#xff08;Distributed Tracing&#xff09;&#xff0c;就是将一次分布式请求还原成调用链路&#xff0c;进行日志记录&#xff0c;性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节…

Vision - 开源视觉分割算法框架 Grounded SAM2 配置与推理 教程 (1)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/143388189 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Ground…

百度如何打造AI原生研发新范式?

&#x1f449;点击即可下载《百度AI原生研发新范式实践》资料 2024年10月23-25日&#xff0c;2024 NJSD技术盛典暨第十届NJSD软件开发者大会、第八届IAS互联网架构大会在南京召开。本届大会邀请了工业界和学术界的专家&#xff0c;优秀的工程师和产品经理&#xff0c;以及其它行…

初认识构建工具

初认识构建工具Webpack & Vite 目录 前言webpack 使用步骤配置文件 _entry_output✨_loader_babel_plugin_source map 开发服务器 前言 不同于node中编写代码&#xff0c;在html、css、js中不能放心使用模块化规范&#xff0c;主要是浏览器兼容性问题&#xff0c;以及…

数据结构 ——— 向上调整建堆和向下调整建堆的区别

目录 前言 向下调整算法&#xff08;默认小堆&#xff09; 利用向下调整算法对数组建堆 向上调整建堆和向下调整建堆的区别​编辑 向下调整建堆的时间复杂度&#xff1a; 向上调整建堆的时间复杂度&#xff1a; 结论 前言 在上一章讲解到了利用向上调整算法对数组进行…

分享几款开源好用的图片在线编辑,适合做快速应用嵌入

图片生成器是指一种工具或软件&#xff0c;用于自动生成图片或图像内容&#xff0c;通常依据用户设定的参数或模板进行操作。这种工具能够帮助用户快速创建视觉效果丰富的图像&#xff0c;而无需具备专业的设计技能。 在数字化时代&#xff0c;图片编辑已经成为日常工作和生活的…

我为何要用wordpress搭建一个自己的独立博客

我在csdn有一个博客&#xff0c;这个博客是之前学习编程时建立的。 博客有哪些好处呢&#xff1f; 1&#xff0c;可以写自己的遇到的问题和如何解决的步骤 2&#xff0c;心得体会&#xff0c;经验&#xff0c;和踩坑 3&#xff0c;可以转载别人的好的技术知识 4&#xff0c;宝贵…

ts:使用fs内置模块简单读写文件

ts&#xff1a;使用fs内置模块简单读写文件 一、主要内容说明二、例子&#xff08;一&#xff09;、fs模块的文件读写1.源码1 &#xff08;fs模块的文件读写&#xff09;2.源码1运行效果 三、结语四、定位日期 一、主要内容说明 在ts中&#xff0c;我们可以使用内置的fs模块来…

十个常见的软件测试面试题,拿走不谢

所有面试问题一般建议先总后分的方式来回答&#xff0c;这样可以让面试官感觉逻辑性很强。 1. 自我介绍 之所以让我们自我介绍&#xff0c;其实是面试官想找一些时间来看简历&#xff0c;所以自我介绍不用太长的时间&#xff0c;1-2分 钟即可。 自我介绍一般按以下方式进行介…

C++中关于 <functional> 的使用

#include <functional> 是 C 标准库中的一个头文件&#xff0c;主要用于提供与函数对象、函数指针和函数适配器相关的功能 一&#xff1a;定义方式 1. 定义和使用 std::function 和 Lambda 表达式 2&#xff1a;使用 std::bind 你可以使用 std::bind 来绑定函数参数&am…

Axios 请求超时设置无效的问题及解决方案

文章目录 Axios 请求超时设置无效的问题及解决方案1. 引言2. 理解 Axios 的超时机制2.1 Axios 超时的工作原理2.2 超时错误的处理 3. Axios 请求超时设置无效的常见原因3.1 配置错误或遗漏3.2 超时发生在建立连接之前3.3 使用了不支持的传输协议3.4 代理服务器或中间件干扰3.5 …

WPF+MVVM案例实战(十五)- 实现一个下拉式菜单(上)

文章目录 1 案例效果2、图标资源下载3、功能实现1.文件创建2、菜单原理分析3、一级菜单两种样式实现1、一级菜单无子项样式实现2、一级菜单有子项样式实现 4、总结 1 案例效果 提示 2、图标资源下载 从阿里矢量素材官网下载需要的菜单图片&#xff0c;如下所示&#xff1a; …

【环境搭建】Apache ZooKeeper 3.8.4 Stable

软件环境 Ubuntu 20.04 、OpenJDK 11 OpenJDK 11&#xff08;如果已经安装&#xff0c;可以跳过这一步&#xff09; 安装OpenJDK 11&#xff1a; $ sudo apt-get update$ sudo apt-get install -y openjdk-11-jdk 设置 JAVA_HOME 环境变量&#xff1a; $ sudo gedit ~/.bash…

后台管理系统的通用权限解决方案(九)SpringBoot整合jjwt实现登录认证鉴权

1&#xff09;创建maven工程jjwt-login-demo&#xff0c;并配置其pom.xml文件如下 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-ins…

国考报名照片无法使用照片审核工具上传失败的解决办法

国考报名过程中&#xff0c;照片审核是至关重要的一步&#xff0c;但许多考生在上传照片时遇到了难题&#xff0c;导致无法继续报名&#xff0c;从而影响抢考场位置&#xff0c;下面就介绍如何快速完成照片处理、审核和上传过审的技巧。 一、国考报名照片基本要求首先&#xff…

vue中如何为不同功能设置不同的默认打印设置(设置不同的打印机)

浏览器自带的window.print 功能较简单&#xff0c;这里使用LODOP露肚皮打印 以下是vue2示例&#xff1a; 从官网中下载Lodop和C-Lodop官网主站安装包并安装到本地电脑可以全局搜索电脑找到安装文件LodopFuncs.js&#xff0c;也可以直接复制我贴出来的文件 //用双端口加载主JS…

数据库管理系统的ACID都各自是什么?

本文基于DBMS中ACID属性的概念&#xff0c;这些属性保证了数据库中执行事务时保持数据一致性、完整性和可靠性所。事务是访问并可能修改数据库内容的单一逻辑工作单元。交易使用读写操作访问数据。为了保持数据库的一致性&#xff0c;在事务前后&#xff0c;遵循某些属性。这些…

ssm基于vue搭建的新闻网站+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 [2 系统…