设计模式(Design Pattern)

惊呆面试官的回答:HashMap和TreeMap的区别 最后,我把HashMap和TreeMap的更多详细区别,都整理在这张表中了,需要的小伙伴可以在我的个人主页中获取。基础哈希图树状图DefinitionHashMap是基于哈希表的Map接口实现。TreeMap是Map接口的基于Tree结构的实现。HashMap实现Map, Cloneable和Serializable接口。TreeMap实现NavigableMap, Cloneable和Serializable接口。空键/值HashMap允许单个null键和多个null值。 阅读详情

一、简述

设计模式是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式的目的:为了代码可重用、让代码更容易被理解、保证代码可靠性。 设计模式使代码编写真正工程化,是软件工程的基石脉络,如同大厦的结构一样。

Java 中有 23 种设计模式,总体来说设计模式分为三大类:

  1. 【创建型模式】共 5 种:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
  2. 【结构型模式】共7种:适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、代理模式。
  3. 【行为型模式】共11种:访问者模式、模板模式、策略模式、状态模式、观察者模式、备忘录模式、中介者模式、迭代器模式、解释器模式、命令模式、责任链模式。

二、设计模式的六大原则

  1. 开闭原则(Open Close Principle)
    对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,需要使用接口和抽象类。

  2. 里氏代换原则(Liskov Substitution Principle)
    面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

  3. 依赖倒转原则(Dependence Inversion Principle)
    这个原则是开闭原则的基础。具体内容:针对接口编程,依赖于抽象而不依赖于具体。

  4. 接口隔离原则(Interface Segregation Principle)
    含义:使用多个隔离的接口,比使用单个接口要好。另外一个含义:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。

  5. 迪米特法则,又称最少知道原则(Demeter Principle)
    一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。

  6. 合成复用原则(Composite Reuse Principle)
    尽量使用合成/聚合的方式,而不是使用继承。

开闭原则具有理想主义的色彩,它是面向对象设计的终极目标。其他几条,则可以看做是开闭原则的实现方法。设计模式就是实现了这些原则,从而达到了代码复用、增加可维护性的目的。

三、Spring 中用到的设计模式

1️⃣代理模式:在 AOP 和 remoting 中被用的比较多。

2️⃣单例模式:在 Spring 配置文件中定义的 bean 默认为单例模式。

3️⃣模板模式:用来解决代码重复的问题。比如 RestTemplate、JmsTemplate、JpaTemplate。

4️⃣委派模式:Spring 提供了 DispatcherServlet 来对请求进行分发。

5️⃣工厂模式:BeanFactory 用来创建对象的实例,贯穿于 BeanFactory/ApplicationContext 接口的核心理念。

四、JDK中常用的设计模式

1️⃣单例模式用于 Runtime、Calendar 和其他的一些类中。
2️⃣工厂模式被用于各种不可变的类如 Boolean,像 Boolean.valueOf。
3️⃣观察者模式被用于 swing 和很多的时间监听中。
4️⃣装饰器模式被用于多个 java IO 类。

五、什么是 GOF(四人帮,全拼 Gang of Four)

在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素)的书,该书首次提到了软件开发中设计模式的概念。四位作者合称 GOF。他们所提出的设计模式主要是基于以下的面向对象设计原则:

1️⃣对接口编程而不是对实现编程。
2️⃣优先使用对象组合而不是继承。

六、装饰模式(decorator design pattern)有何例子?它是作用于对象层次还是类层次?

装饰模式增强了单个对象的能力。Java IO 到处都使用了装饰模式,典型例子就是 Buffered 系列类如 BufferedReader 和 BufferedWriter,它们增强了 Reader 和 Writer 对象,以实现提升性能的 Buffer 层次的读取和写入。

相关推荐

《第二十二篇》Cross-Attention:注意力机制详解-代码实现和公式详解《二》

本文详细介绍了Cross-Attention的原理、公式和实现。Cross-Attention用于Transformer解码器和Encoder-Decoder结构,通过查询向量(Q)与键、值向量(K、V)的交互实现序列对齐。核心公式为softmax(QK^T/√d_k)V,其中Q来自Decoder,K、V来自Encoder。文章还给出了多头注意力机制公式和PyTorch实现代码,包括投影计算、注意力分数计算和输出处理。代码示例展示了如何构建一个完整的Cross-Attention模块,并演示了其在解码器查询

guoguozgw的博客 2209

RestTemplate及HttpClient

RestTemplate是spring-web-xxx.jar包中提供的Http协议实现类。也就是说导入spring-boot-starter-web的项目可以直接使用RestTemplate类,就是基于模板方法设计模式的,封装了所有需要使用的API。如果只需要获取响应体中内容(调用控制器方法的返回值)使用此方法。原文链接:https://blog.youkuaiyun.com/weixin_56219549/article/details/122458941。在该类中主要针对6类请求方式封装的方法。

weixin_52793468的博客 268

迈德威视相机调用( 基于 Linux系统+ OpenCV )

迈德威视相机调用( 基于 Linux系统+ OpenCV )前言一、登录迈德威视官网,下载官方SDK二、代码调用与视频帧处理( 基于 OpenCV )总结 前言     此博客记录了迈德威视工业相机在 Linux 系统下的代码调用及其环境配置,通过 OpenCV 对视频帧进行处理。   一、登录迈德威视官网,下载官方SDK      迈德威视官网 : http://www.mindvision.com.cn/     1. 进入官网后,在服务支持中选择软件下载。    2. 选择Linux系统S.

kkkkkk0729的博客 5678

RestTemplate详解

详解 RestTemplate 操作 作为开发人员,我们经常关注于构建伟大的软件来解决业务问题。数据只是软件完成工作时 要处理的原材料。但是如果你问一下业务人员,数据和软件谁更重要的话,他们很可能会选择 数据。数据是许多业务的生命之血。软件通常是可以替换的,但是多年积累的数据是永远不能 替换的。 近几年来,以信息为中心的表述性状态转移(Representational State Transf...

qq_42324187的博客 311

【训练】Qwen2.5VL 多机多卡 Grounding Box定位

之前的相关文章:【深度学习】LLaMA-Factory微调sft Qwen2-VL进行印章识别使用LLaMA-Factory微调sft Qwen2-VL-7B-Instruct构建最新的LLaMA-Factory镜像。

q742971636的博客 2583

从零构建OpenBMC风扇控制:基于phosphor-pid-control的实战配置指南

本文详细介绍了如何从零开始构建OpenBMC风扇控制系统,基于phosphor-pid-control框架实现风扇自动调速。通过解析PID算法配置、传感器定义及控制区域设置,提供工业级散热解决方案,帮助开发者优化服务器能效与可靠性。

weixin_29263201的博客 747

设计模式(二)——创建型模式——单例模式(Singleton)

单例模式(Singleton) 定义:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 优点:节约系统资源、提高了系统效率,同时也能够严格控制客户对它的访问。 缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。 实现思路:让类的构造方法私有化,同时提供一个静态方法去实例化这个类。 单例模式大致有四种写法,懒汉式、饿汉式、...

最初的模样 391

异步处理优化:多线程线程池与消息队列的选择与应用

本文讨论了两种常见的异步处理方式:多线程线程池和消息队列(MQ)。通过将非核心逻辑异步化,可以提升系统的性能和响应速度。多线程线程池适用于本地并发任务,适合需要快速响应的场景,但无法处理跨服务任务。消息队列则适用于分布式系统,能够解耦服务并保证任务的可靠性和顺序性,适合处理高并发和高可靠性要求的任务。文章提供了实际代码示例,帮助开发者根据业务需求选择合适的异步处理方式。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 170万+

java 单例模板_Spring Boot单例RestTemplate接受标头不断被附加到

我正在使用Spring Boot(1.3.0.RELEASE)。我需要使用RestTemplate调用许多不同的RESTWeb服务。显然,我不想每次调用都创建一个RestTemplate的新实例,因此我为RestTemplate的一个实例创建了一个配置,如下所示:@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}...

weixin_39700548的博客 843

【实战项目开发技术分享】如何设置机器人禁行区/虚拟墙

在现代机器人技术的日益发展中,路径规划是使机器人在复杂环境中安全、高效移动的关键部分。其中一个重要的问题是如何划定机器人的禁行区,以确保机器人不会进入危险区域或无法到达的地方。在本文中,我们将探讨一些关键策略,帮助机器人算法工程师更好地划定禁行区。代价地图可以通过多层叠加来实现,一般包括以下几个层级:静态地图层(Static Map Layer):由SLAM(Simultaneous Localization and Mapping)构建的静态地图。该层包含了环境中固定不变的地物信息,如墙壁、家具等。

xiewf的博客 1万+

从零开始跑通3DGS教程:(三)坐标系与尺度编辑(CloudCompare)

本文所属《从零开始跑通3DGS教程》系列文章; sfm重建的点云已经丢掉了尺度信息,并且坐标系跟图像数据有关(SFM初始化选择的图像),所以如果想恢复物理真实尺度,以及在想要的视角下渲染,那么需要对尺度和坐标系进行编辑修正,下文介绍如何使用CloudCompare修改坐标系和尺度

诺有缸的高飞鸟的博客 2871

《设计模式Design Pattern》读书笔记之一

     《设计模式Design Pattern》读书笔记之一      本书所使用到的符号(Guide To Notation) 《Design Pattern》这本书虽然有时候也使用一些非正式的图来表明自己的思想,但在设计模式中表示类/对象之间的关系时,使用规范的图。可能我的书版本比较老一些的缘故?它使用的图并不是基于UML,而是基于UML的前身。类图(class diagram)、对象图(o

Jadyleung的专栏 1924

Far planner 代码系列(35)动态障碍物预处理_激光雷达部分

主要讲解动态障碍物在激光雷达部分的剔除机制

博客 1057

Design-Pattern 项目教程

Design-Pattern 项目教程 项目介绍 Design-Pattern 是一个开源项目,旨在帮助开发者理解和应用软件设计模式。设计模式是软件开发中常见问题的典型解决方案,通过使用这些模式,开发者可以提高代码的可维护性、可扩展性和可重用性。该项目提供了多种设计模式的实现示例,并附有详细的文档说明,帮助开发者快速上手和应用这些设计模式。 项目快速启动 1. 克隆项目 首先,你需要将项目克隆到本...

gitblog_00092的博客 959

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

深度学习工具包 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")

《设计模式Design Pattern》读书笔记之十七

《设计模式Design Pattern》读书笔记之十七Observer模式结构 目的在一个一对多(one-to-many)的关系中,当一个对象(one)的状态被更新的时候,它的所有的相关对象(many)都会被得到通知。 讨论1,  可能会带来很大的状态更新成本,subject的一个很小的状态更新都可能使得大量的observer进行相应的更新。更为严重的是,如果subject不提供是什么状态被更新了

Jadyleung的专栏 1450

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Design Pattern 新解

什么是 Design Pattern?许多人一讲到 Design Pattern,就会扯到什么建筑设计,因为他们全都是看四人帮的「Design Patterns」经典本的解释,没消化就照单全收。 如果不能用更生活化的方式解释 Design Pattern,我会怀疑他们是不是真的了解 Design Pattern 的真义。 什么是 Pattern Pattern 最简单的定义是:只要是一再重复出现的

zaowei21的专栏 1549

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Go语言设计模式书籍推荐:与golang-design-pattern配套的学习资源

在Go语言开发中,设计模式是提升代码质量和架构能力的关键知识。本文将介绍与[golang-design-pattern](https://link.gitcode.com/i/294d8b6a49cba8441e2ea7ebc4210e92)项目配套的学习资源,帮助开发者系统掌握Go语言设计模式的实现与应用。 ## 核心参考书籍 ### 《研磨设计模式》 该项目明确标注为《研磨设计模式》读书笔...

gitblog_00593的博客 1032

《设计模式Design Pattern》读书笔记之九

《设计模式Design Pattern》读书笔记之九Decorator模式结构 目的动态地给一个对象增加功能(responsibilities)。 讨论1, 给一个对象增加功能,最简单的方法是派生一个类;但这是一种静态的方法,不灵活。而Decorator是一种动态的方法,比较灵活。2, 对于一个轻量型的component,Decorator模式是一种比较好的方法,但如果component是重量型的

Jadyleung的专栏 1341

《设计模式Design Pattern》读书笔记之十一

《设计模式Design Pattern》读书笔记之十一Proxy模式结构 目的当访问一个对象花费比较大的时候,可以为它生成一个代理(proxy)。 应用remote proxy    远程代理,用本地的一个对象代理远程对象virtual proxy    虚拟代理,只有在需要的时候(on demand)才生成一个代价昂贵的对象protection proxy 保护代理,控制对对象的访问权限smar

Jadyleung的专栏 1426

design pattern 设计模式

1.设计模式(Designpattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。2.使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。3.设计模式使代码编制真正工程化,设计模式是软件工程的基石4.项目中合理的运用设计模式可以完美的解决很多问题模式在某些场景下,针对某类问题的某种通用的解决方案。场景项目所在的环境问题约束条件,项目目标等解决方案通用、可复用的设计,解决约束达到目标。学习设计原则是学习设计模式的基础。.........

qq_51490070的博客 1303

探索设计模式的奇妙世界:Hello Design Pattern 项目推荐

探索设计模式的奇妙世界:Hello Design Pattern 项目推荐 项目介绍 "Hello Design Pattern" 是一个旨在通过实际代码示例展示所有23种GoF设计模式的开源项目。该项目以经典的“Hello World”程序为基础,通过不同的设计模式实现相同的功能,帮助开发者深入理解每种设计模式的实际应用和优势。无论你是设计模式的新手还是经验丰富的开发者,这个...

gitblog_00088的博客 445

C语言设计模式 PDF《C Design Pattern》资源下载

C语言设计模式 PDF《C Design Pattern》资源下载 【下载地址】C语言设计模式PDFCDesignPattern资源下载 《C Design Pattern》是一本专注于C语言设计模式的实用指南,深入解析了设计模式的核心概念及其在C语言中的具体实现。本书不仅帮助开发者理解设计模式的原理,还通过丰富的实践案...

gitblog_06799的博客 610

《设计模式Design Pattern》读书笔记之十八

《设计模式Design Pattern》读书笔记之十八State模式结构 目的当一个对象(context)根据当前本身的状态(state),会产生不同的行为的时候,可以采用state模式。把所有跟改状态相关的行为/动作转移到一个外部的state对象中。这样,可以避免context内部大量的switch.if等判断。 优缺点带来更大的灵活性和可维护性,因为一个新的状态可以很容易地通过派生一个类来追加

Jadyleung的专栏 1638

Design Pattern之初见

对design pattern稀里糊涂的,特开一篇,来慢慢完善下理解。        以前看过head first这本书,算是知道了有design pattern这种东西。不过那时还没经过什么项目,看得云里雾里,总的来说就是随波逐流,因为近几年确实很火。看到网上很多关于design pattern的评论,学习心得,书籍信息,感觉基本上出于三类人之手。        一类是真正的大牛,这部分人已

林学森的技术专栏 1354

《设计模式Design Pattern》读书笔记之十五

《设计模式Design Pattern》读书笔记之十五Mediator模式结构 目的为了减少大量的对象(colleague)之间互相通信的复杂性,创建一个中间人--mediator(类似于HUB);这样,各个colleague只要建立跟mediator之间的联系,而不需要直接跟各个colleague直接连接。各个colleague之间的通信完全通过mediator进行处理。 优点1,  Media

Jadyleung的专栏 1501

《设计模式Design Pattern》读书笔记之八

《设计模式Design Pattern》读书笔记之八Composite模式目的在一个part-whole的继承结构中,把整体(composition)和个体(object,component) 统一地对待。这样,对client来说,不用区别是整体还是个体,都可以进行同样的操作。 结构 讨论1, 一个缺点是给限制composite中的component带来困难。2, 有时候增加一个parent re

Jadyleung的专栏 1235
上一篇: MySQL 索引结构用B+树的原因
下一篇: 使用JDBC连接数据库
JFS_Study
博客等级 码龄6年 363粉丝 359原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JFS_Study

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值