Java与设计模式(06)--策略模式

Java 23种设计模式(全)整体概述:附代码示例 设计模式是为解决软件设计中通用问题而被提出的一套指导性思想。它是一种被反复验证、经过实践证明并被广泛应用的代码设计经验和思想总结,可以帮助开发者通过一定的模式来快速地开发高质量、可维护性强的软件。‌‌设计模式‌描述了在软件开发过程中不断重复出现的问题及其解决方案,旨在提高软件系统的可维护性可扩展性可重用性和灵活性。设计模式不仅关注代码的可靠性可读性和可重用性,还强调代码的易理解性,帮助开发者通过特定的模式快速开发高质量高可维护性的软件。设计模式在软件开发人员中非常流行。 阅读详情

定义


策略模式(Strategy):它定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。


角色

  1. Strategy接口:定义了算法的形式;
  2. ConcreteStrategy:实现了具体算法;
  3. Context:对接口中的算法进行实用;
  4. Client:测试类;


实际使用

这里我们可以看个例子:


例子一:

我们有一个这样的类:

package com.freesoft.designpattern.strategy;

public class Person {
	private int id;
	private String name;
	
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}


}

有一天我们想对这个类组成的集合对象进行排序,那么必须要有一个手段能够对这个类的对象进行比较,所以我们这样实现:

package com.freesoft.designpattern.strategy;

public class Person implements Comparable<Person> {
	private int id;
	private String name;
	
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public int compareTo(Person o) {
		if (this.getId() != o.getId()) {
			Integer id1 = Integer.valueOf(this.getId());
			Integer id2 = Integer.valueOf(o.getId());
			return  id1.compareTo(id2);
		} else {
			String name1 = this.getName();
			String name2 = o.getName();
			return name1.compareTo(name2);
		}
	}
}

通过以上实现,我们能够对Person类型的两个对象实现比较操作,首先比较id,如果id相同那么比较name字段。在集合中我们可以根据这个规则(策略)来对集合进行排序。


问题来了,我们不能保证这个规则/策略就是我们需要的策略。比如,我们可能需要先比较name字段,或者我们可能在某种情况下使用id优先原则,某种情况下使用name优先原则,所以我们的策略是会变化的。


考虑到以上问题,我们需要修改我们的代码,我们单独编写一个策略类:

package com.freesoft.designpattern.strategy;

import java.util.Comparator;

public class PersonComparatorById implements Comparator<Person> {
	@Override
	public int compare(Person o1, Person o2) {
		if (o1.getId() != o2.getId()) {
			Integer id1 = Integer.valueOf(o1.getId());
			Integer id2 = Integer.valueOf(o2.getId());
			return  id1.compareTo(id2);
		} else {
			String name1 = o1.getName();
			String name2 = o2.getName();
			return name1.compareTo(name2);
		}
	}
}

并且我们的Person代码变为:


package com.freesoft.designpattern.strategy;

import java.util.Comparator;

public class Person implements Comparable<Person> {
	private int id;
	private String name;
	private Comparator<Person> c;
	
	public Person(int id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

	public Comparator<Person> getC() {
		return c;
	}

	public void setC(Comparator<Person> c) {
		this.c = c;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public int compareTo(Person o) {
		return c.compare(this, o);
	}
}

这样如果我们今后需要使用name优先的比较原则,我们只需要实现一个新类:

package com.freesoft.designpattern.strategy;

import java.util.Comparator;

public class PersonComparatorByName implements Comparator<Person> {
	@Override
	public int compare(Person o1, Person o2) {
		if (o1.getName().equals(o2.getName())) {
			Integer id1 = Integer.valueOf(o1.getId());
			Integer id2 = Integer.valueOf(o2.getId());
			return  id1.compareTo(id2);
		} else {
			String name1 = o1.getName();
			String name2 = o2.getName();
			return name1.compareTo(name2);
		}
	}
}

我们的测试类如下:


package com.freesoft.designpattern.strategy;

public class Client {
	public static void main(String[] args) {
		Person p1 = new Person(10, "zhangsan");
		Person p2 = new Person(20, "lisi");
		
		PersonComparatorById cId = new PersonComparatorById();
		PersonComparatorByName cName = new PersonComparatorByName();
		
		p1.setC(cId);
		System.out.println("p1 compara p2 by Id: " + p1.compareTo(p2));
		p1.setC(cName);
		System.out.println("p1 compara p2 by Name: " + p1.compareTo(p2));
	}
}



总结

  1. 我们的Comparator接口就是我们抽象的策略;
  2. 我们实现的一个个的PersonComparatorByXXX就是具体的策略;
  3. Person提供了比较的功能,但实际使用时通过setC传入不同的比较策略,所以在实际使用中非常灵活,并且可以独立单元测试、代码维护成本极低。



设计模式实战总结与Java程序员学习路线图 本专栏分为26篇文章,内容涵盖了20多个具体的系统设计案例,每个案例都深入探讨了不同的设计模式及其应用场景。通过这些案例,读者可以逐步掌握设计模式的核心思想,并学会如何在实际项目中灵活运用这些模式。工厂模式:应用于对象的创建过程,简化了复杂对象的创建,并提高了系统的可扩展性和维护性。策略模式:通过封装算法,使得系统可以根据不同情况选择合适的算法或行为,提高了系统的灵活性。观察者模式:用于实现系统模块之间的松耦合,使得模块可以独立演化而不影响其他部分。命令模式。 阅读详情

相关推荐

C语言新手必练:10个实战小项目带你快速上手(附完整代码)

本文为C语言初学者精选10个实战项目,从基础的温度转换器到高级的迷宫求解算法,涵盖输入输出、条件判断、循环控制、数组操作等核心知识点。每个项目配有完整代码和详细解析,帮助新手通过实践掌握编程思维,特别适合刚学完语法但缺乏实战经验的学习者。

weixin_29208077的博客 743

06—Java设计模式——工厂模式、策略模式、单例模式

目录 六大设计原则 工厂模式 1、工厂模式在Spring中的应用: 2、简单工厂 3、方法工厂 4、抽象工厂 策略模式 设计模式是编程的一种理念、思想,不管是那种设计模式都遵循这设计模式的六大原则。如果要是要用一句话来概括的话那就是“用抽象封装框架、用实现拓展细节”,如果用一个词来概括的话那就是“解耦”。六大原则与设计模式我们需要遵守但是也不可矫枉过正,否则的话项目的代码将变得杂乱。 六大设计原则 单一职责:一个类只负责具体具体领域的一个职责,而不是实现很多的功能 ...

任天柳 1714

《联邦学习实战》杨强 读书笔记十四——构建公平的大数据交易市场

当数据具有资产属性之后,数据便可以直接或者间接地为公司、为社会创造价值和收益,并且可以作为一种特殊的商品在市场中进行交易。 与传统的商品交易相比,数据资产交易的市场前景更广阔,但同时也面临着很多的挑战,主要包括: 数据的质量、价格如何定义 在合法合规的前提下,数据的交易如何确保不会泄露用户的隐私 如何构建合理的激励机制来鼓励更多的参与方加入数据交易市场中 大数据交易 数据交易的定义 数据交易是指一种对数据进行买卖的行为,大数据交易由三方共同参与,分别为数据提供方、大数据交易平台和数据需求方:

IEEE802_11的博客 3433

如何选择工厂模式或策略模式:Java设计模式实践指南

工厂模式主要解决的是“对象创建”的问题,而策略模式则专注于“行为变化”的管理。两者虽然在结构和用途上有很大的不同,但在一些复杂的设计中,常常会有交叉和组合使用的情况。因此,理解它们的区别和各自的适用场景,对于构建灵活和可维护的系统至关重要。工厂模式是一种创建型设计模式,通过将对象的实例化过程封装起来,使得客户端不需要直接依赖具体类,从而实现对象创建过程的灵活性和扩展性。它主要包含三种不同的实现形式:简单工厂模式、工厂方法模式和抽象工厂模式。

2401_85639015的博客 1311

解决Anaconda环境下catkin_make编译报错:Python路径冲突与empy模块缺失

本文详细分析了在Anaconda环境下使用catkin_make编译时出现的Python路径冲突与empy模块缺失问题,提供了快速解决方案和永久性环境配置方法。通过显式指定Python解释器路径或调整Anaconda配置,有效解决编译报错问题,适用于ROS开发与科学计算并行的场景。

weixin_28829629的博客 353

DaVinci Developer中枚举类型变量的创建与实战应用

本文详细介绍了在DaVinci Developer中创建和使用枚举类型变量的方法与实战应用。通过智能温控系统的案例,阐述了枚举类型在嵌入式开发中的核心价值,包括提升代码可读性、类型安全性和维护便捷性。文章还提供了枚举类型在状态机实现和多模块协同中的高级应用技巧,以及调试与优化的实用建议。

ik678901234的博客 511

Java设计模式:工厂模式与策略模式的实现与应用

工厂模式(Factory Pattern)是一种创建对象的设计模式,它提供了一种创建对象的接口,但由子类决定实例化哪个类。工厂模式将对象的创建与使用分离,提高了系统的灵活性和可维护性。策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,将每一个算法封装起来,并使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户。工厂模式和策略模式是两种常见的设计模式,它们在不同的场景下解决不同的问题。工厂模式主要关注于对象的创建,通过工厂类将对象的创建与使用分离。

weixin_41859354的博客 1392

【MATLAB代码】基于水声通信(ACOMMS)下的到达时间差(TDOA)定位的AUV自主导航例程,附完整代码

水下AUV导航系统仿真研究 本研究基于到达时间差(TDOA)技术实现了水下自主航行器(AUV)的三维导航仿真系统。系统采用四个声学信标作为定位基准,通过TDOA测量数据迭代求解AUV位置。仿真结果表明: 导航性能:系统能够有效跟踪AUV从起点(30,30,-20)到目标点(70,70,-20)的航行轨迹,定位误差保持在合理范围内。 误差分析:定位误差变化曲线显示系统具有稳定的定位精度,平均误差为0.5米左右。 技术特点:采用两步最小二乘迭代算法求解非线性TDOA方程,提高了定位精度和计算效率。 该仿真系统为

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 320

工厂模式与策略模式在Java中的应用案例分析

工厂模式和策略模式都是Java设计模式中的重要模式,工厂模式主要解决对象创建问题,而策略模式主要解决算法选择问题。在实际开发中,这两种模式经常结合使用,以提高代码的灵活性、可扩展性和可维护性。通过对工厂模式和策略模式的应用案例分析,我们可以更好地理解它们的适用场景和设计原则,从而在项目中合理运用这些设计模式,提升代码质量和系统性能。

weixin_41859354的博客 2150

YOLOv8n轻量化实战:10分钟打通实时摄像头目标检测,附参数调优与避坑指南

本文介绍了如何快速入门YOLOv8目标检测框架,通过摄像头实战实现实时检测。YOLOv8凭借轻量化架构和跨平台优势,是新手入门的理想选择。文章详细讲解了环境搭建(1分钟完成)、核心代码逻辑(3分钟掌握)以及性能调优技巧(3分钟进阶),提供可直接运行的代码示例。重点包括:模型选择(优先yolov8n.pt)、摄像头参数优化、置信度阈值调整、检测类别指定等实用技巧,帮助开发者快速实现10-15FPS的实时检测效果,并针对不同场景提供优化建议。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 370

手把手教你完成基于cnn的手写数字识别系统MATLAB语言

手写数字识别是经典的 CNN 分类应用之一,常用的数据集就是 MNIST 手写数字数据集,包含 0~9 这 10 个数字的手写图片,每个数字都由 6 万幅训练图像和 1 万幅测试图像构成。为了便于直观分析,这里选择 MATLAB 工具箱提供的 DigitDataset 进行训练识别,读者也可以直接利用 MNIST 数据集或者自己设计的数据集进行实验。其中,数据集文件夹 db 如图 所示。在数据集文件夹 db 里面对每个数字都建立了子文件夹,各自包含 1000 幅 28×28 大小的二维灰度图像。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1368

策略模式Java

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式使得算法可以在不影响客户端的情况下发生变化。该模式通过将算法的实现从使用它的客户端中分离出来,使得算法的变化不会影响到客户端。

我这个代码你能看懂吗? 563

Django框架中settings文件的部署建议

为了更好地管理开发和生产环境的配置,建议将settings文件分为多个文件,分别用于不同的环境。然后,通过在启动应用程序时指定不同的settings文件,来加载相应的配置。在Django框架中,settings.py文件是非常重要的配置文件,它包含了项目的各种设置和选项。在Django框架中,settings.py文件是非常重要的配置文件,它包含了项目的各种设置和选项。可以使用Python的。为了更好地管理开发和生产环境的配置,建议将settings文件分为多个文件,分别用于不同的环境。

WELL_CODER的博客 128

工厂模式和策略模式的核心区别与最佳实践

工厂模式是一种创建型设计模式,它通过定义一个接口或抽象类来创建对象,但将实际的对象创建工作推迟到子类中。也就是说,工厂模式使用工厂类或方法来封装对象的创建过程,使得客户端代码不直接依赖于具体的类。简单工厂模式(Simple Factory Pattern):通过一个静态方法,根据参数返回不同类型的对象。工厂方法模式(Factory Method Pattern):定义一个创建对象的接口,但将具体实现交由子类来决定。抽象工厂模式(Abstract Factory Pattern)

weixin_41859354的博客 2012

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

设计模式之策略模式

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户端。2. 避免多重条件判断:将不同的算法封装在独立的类中,避免了在一个大方法中使用大量的条件判断来选择算法。它适用于当一个类在其操作中需要使用多种不同的算法,或者算法在未来可能会经常变化的情况。3. 提高代码的可读性和可维护性:算法的实现和使用分离,使得代码结构更清晰。1. 易于扩展:可以轻松添加新的策略而无需修改现有代码。

alankuo的专栏 489

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

深入理解Java设计模式:23种模式的全面解析

在Java编程中,设计模式是解决常见问题的最佳实践总结,以下是对23种常见Java设计模式的详细解析。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【Java】Java 设计模式之工厂模式与策略模式

Java设计模式是软件工程中一系列被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,它们代表了最佳的实践,帮助开发者解决在软件设计过程中遇到的各种问题。这些模式可以根据其用途分为三大类:创建型、结构型和行为型,每种模式都有其特定的应用场景和解决的问题,例如单例模式用于确保一个类只有一个实例,工厂模式用于创建对象而不暴露创建逻辑,观察者模式用于定义对象间的一对多依赖关系,使得当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。掌握这些设计模式有助于提高代码的可读性、可维护性和可扩展性。

Young_Pro的博客 1884

java设计模式(1) 适配器模式、装饰器模式、策略模式、观察者模式

之所以会先提到适配器,也是因为在用到GUI编程(awt,swing,swt,jface)的时候经常会遇到。这是在编写awt编程的时候,用到了MouseAdapter,当然这块内容有很多Adapter。我们来看SynchronizedList,它是Collections的静态内部类。MouseListener是一个接口,里面有鼠标的各种事件。上面的这种适配器用法对应的是适配器的第三种用法。这是我在学习安全的并发容器类时用到过的,比如。核心:在不改变原有类的基础上给类新增功能。适配器的主要作用:把原本。

m0_56799642的博客 2165

Java二十三种设计模式-策略模式(13/23)

策略模式是一种行为型设计模式,它允许在运行时选择算法的行为,将算法封装在独立的策略类中,从而让算法可以互相替换。清晰的合同:策略接口应该清晰地定义策略的合同,让实现者容易理解和实现。合理定义:确保策略接口的定义合理,既不要太宽泛也不要太狭窄。策略模式提供了一种灵活的方式来替换和扩展算法,使得系统更加灵活和可扩展。通过本文的深入分析,希望读者能够对策略模式有更全面的理解,并在实际开发中做出合理的设计选择。博主还写了其他Java设计模式关联文章,请各位大佬批评指正:(一)

小相探索IT世界 1969

设计模式——策略模式

策略模式是一种非常实用的设计模式,它提供了管理算法族、分离算法实现和算法使用的有效方法。通过策略模式,我们可以在不修改原有系统的情况下,灵活地增加新的算法或行为。

weixin_42564451的博客 1269

23种设计模式之策略模式

本文介绍了策略模式,包括其结构及在支付案例中的 Java 实现和 Spring 依赖注入方式实现。策略模式可灵活封装算法,使不同算法相互替换,提高代码可维护性与扩展性。

qq_43657722的博客 2043

Java 设计模式之策略模式 (Strategy Pattern) 详解

策略模式通过将算法的选择和实现分离,使得算法可以独立变化,客户端代码可以更简洁和灵活。策略模式(Strategy Pattern)是一种行为型设计模式,旨在定义一系列算法,将每个算法封装起来,并使它们可以互相替换,从而使得算法的变化不会影响使用算法的客户端。策略模式的主要结构包括策略接口、具体策略类和上下文类,通过将算法的选择与使用分离,实现了代码的可维护性和灵活性。通过策略模式和工厂模式的结合,可以实现一个灵活、可扩展且易于维护的支付系统。通过策略模式,可以根据用户选择的支付方式动态切换支付策略。

微笑听雨 3575

23中设计模式之策略模式

策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。这种模式定义了一系列可互换的算法,并将每个算法封装在自己的类里。这些算法以相同的方式声明,因此客户端可以使用相同的接口调用不同的算法。

weixin_43564783的博客 1002

设计模式-工厂模式和策略模式的区别

工厂模式关注的是创建过程,而策略模式关注的是行为或算法的变化。它们可以在不同的设计中单独使用,也可以结合使用以实现更复杂的功能。工厂模式:通过创建工厂类,将对象实例化的责任转移到工厂。当我们不知道需要实例化哪个类时,会使用工厂模式。它隐藏了对象实例化的复杂性。策略模式:允许在执行时选择不同算法或操作。当我们需要动态地改变对象的行为或者算法时,会使用策略模式。这使得算法可以独立于使用它的客户端而变化。

技术日常 1699

设计模式-策略模式

本文以Alipay、wecatpay为示例介绍支付系统中如何使用策略模式 第一步.........

wubingyuqq的博客 1898
上一篇: 移动开发工具介绍——跨平台开发工具之PhoneGap
下一篇: 缓存图片并显示的ImageView
Soloman
博客等级 码龄25年 171粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值