当前位置: 主页 > JAVA语言

java中的策略模式-策略模式 工厂模式

发布时间:2023-03-24 11:19   浏览次数:次   作者:佚名

在数据展示的时候,我们都知道,干巴巴的罗列数字,并不直观。如果有柱状、折线、饼图之类的对比图,做到数据可视化,则会一目了然。

在技术领域也一样,有些概念,都是开发经验丰富的「老司机」写出来,相当的浓缩,需要阅读者有相当的开发经验才能化得开,理解透彻。如果在技术内容中,能够像数据可视化一样,增加「饼图」,给我们画个饼,就更易于理解。可谓一图胜 千言啊。

今天我们推荐两本能给我们在技术内容之外「画饼」的书,便于吸收,一口气上五楼。

设计模式

一直以来,在软件开发领域,有一些类似珍稀武功秘籍一样的内容,掌握之后,可以将软件设计得更优美,对于开发能更便于解耦和扩展,这其中之一就是「设计模式」。

此外,对于模式,在我们技术人员讨论方案,这个模式相当于一种共同可以理解的语言,说这里用个单例,那里需要代理,彼此即可意会。

也正因为通用,在软件开发中会经常看到设计模式,特别是开源软件盛行的今天,理解了设计模式,我们在阅读开源代码时,能更快地理解作者的设计意思,抓住脉络。

我在之前的几篇文章里写过 Tomcat 源代码中的设计模式使用,可以搭配着看。

我们最早听说设计模式估计都是从课堂上老师的口中,或者某些技术书籍中,类似于这里使用了工厂模式、那里使用了模板方法模式,其中有一个地方用到了策略模式等等。

java中的策略模式_状态模式 策略模式_策略模式 工厂模式

说到这些模式之后,基本都会提到鼎鼎大名的 GoF——设计模式四人帮。正是这四个人将这一系列在软件开发中可能经常用到,又经过时间考验的模式提炼加工,并为之命名,成为我们今天看到的这常用的 23 种模式的样子。

以往我们提到设计模式,基本的划分方式都是按照 GoF 的分类:

比如把 Factory、Singleton 归为创建型模式,把 Facade、 Adapter 归为结构型模式,把 Strategy、Template Method 等归为行为型模式。

GoF 的描述,相对比较精炼,需要反复阅读才能理解其中设计的精妙,或者需要有较丰富的 OOP 经验。

最近发现一本讲述设计模式的书《图解设计模式》

策略模式 工厂模式_状态模式 策略模式_java中的策略模式

这本书并没有沿袭 GoF 一直以来的模式划分方式,而是更细致地根据具体作用,将分类做了细化。

java中的策略模式_策略模式 工厂模式_状态模式 策略模式

比如:

同时对于模式,初学者一直的困扰是「这都是啥?」根据名字并不能直观地理解这个模式大致的意图。这个在书中也都给一一做了简要描述。

在《图解设计模式》一书中,对每个模式都会有一个形象的图来概括这个模式,同时还有一句简短且易于理解的句子来描述模式。

比如对于策略模式:

整体的替换算法

通过这句描述可以比 Strategy 能更好地理解模式背后的意思吧?在讲解模式时,还有一小段文字来详细的描述。另外,再辅以下方在不同情况下适配的不同插头,很形象。

策略模式 工厂模式_状态模式 策略模式_java中的策略模式

策略模式 工厂模式_java中的策略模式_状态模式 策略模式

在对模式的讲解中,会先通过软件开发的「通用语言」- UML 图来展示,在这之后会有具体的代码。代码之外,作者的书还有一个特点:

将模式中各个涉及到的类抽象为「角色」。就像影视剧一样,通过角色来理解剧情,而不是仅着眼于具体的示例代码,不能做到活学活用。

同时,每个模式最后,会有「拓展思路的要点」和「相关的设计模式」两部分内容。第一部分相当于追问使用之后有哪些优势及劣势,第二部分则会对比类似的模式。

当然,对于模式的学习,正如作者在书中所说,不能只看书里的案例,还要自己思考一些案例,同时理解模式中对应的角色,通过抽象的角色来面对模式适用的不同场景,将模式化用到设计与编程中。

Java并发编程

坦白地说,对于任何编程语言来说,多线程编程都不是个容易学的内容。这源于多线程编程的复杂性。

方法的互斥,内存的可见性、线程的切换与优先级、死锁、甚至环境的复杂与隐蔽等,有些单线程处理正常的程序,放到多线程环境中会有各种各样的问题。问题产生后还难以复现。

策略模式 工厂模式_状态模式 策略模式_java中的策略模式

但多线程又是一个不得不面对的问题,机器硬件性能越来越高,核越来越多,相应的软件却没有利用起来,岂不是暴殄天物!

在 Java 并发编程方面,一直以来神书是 Brian Goetz 的《Java并发编程实战》。此外就是已经绝版的 Doug Lea 的著作。

那对于信息量不小的 Java 并发编程java中的策略模式,往往每个概念都会让人望而却步。比如 Java 内存模型(JMM),比如 volatile 如何影响可见性与指令重排序,什么是 Happens-Before,如何应用线程池,wait 与 notify 是如何工作的,如何分别针对读与写的线程进行优化?

java中的策略模式_状态模式 策略模式_策略模式 工厂模式

关于内存可见性java中的策略模式,如果有这样一张图,会不会清晰明了呢?我们看到 volatile 在读写时,两只小眼睛一直盯着共享内存中的数据,不受缓存的干扰。

策略模式 工厂模式_java中的策略模式_状态模式 策略模式

这里推荐的是与前面的《图解设计模式》同一作者的书《图解Java多线程设计模式》,通过模式的方式来讲述 Java 并发编程。

java中的策略模式_状态模式 策略模式_策略模式 工厂模式

状态模式 策略模式_策略模式 工厂模式_java中的策略模式

讲述风格同前面的书一致,依然是一图胜千言。

比如读写锁,写的线程就会被阻塞,等待锁:

状态模式 策略模式_策略模式 工厂模式_java中的策略模式

对于并发涉及到的关键「人物」,也通过模式中的「角色」来描述:

状态模式 策略模式_策略模式 工厂模式_java中的策略模式

书中除通过模式讲解并发知识外,在每个模式后,会有「扩展阅读」部分,描述这些内容在 JDK 里是怎样实现的。

对于多线程最重要的是理解这背后的一系列概念,从而在使用多线程时不至于出错——在需要互斥时候并没有锁,需要保证内存可见性进行线程状态的控制时,仅仅用了一个普通变量,忘记了volatile,在使用线程池时没有理解 Worker Thread 的原理,都会导致问题。 而理解了这些内容,才能避免怪异的问题,减少为此加班 :) 。

关于并发,我在之前的文章里也写过一些:

END