设计模式在jdk中的应用

前言

最近重学设计模式,而且还有很多源码要看。所以就想一举两得。从源码中寻找设计模式。顺便还可以看看源码。。。
本文只是寻找设计模式在java中的应用。优缺点就不细说了。而且也不可能将jdk中所有涉及设计模式的例子都举出来。希望大家积极评论。来补全这一块

工厂模式

jdk中的应用

java.sql包
线程池

解释和代码

线程池中有线程创建工厂。应用了工厂模式

策略模式

jdk中的应用

JAVA AWT 中的 LayoutManager
Comparator

解释和代码

在集合元素的比较中,可以传入一个comparer。不同的comparer有不同的比较策略

装饰者模式

jdk中的应用

java.io包

解释和代码

装饰者模式可以动态地给一个对象增加其他职责,就扩展对象功能来说,装饰者模式比生成子类更为灵活。在由InputStream,OutputStream,Reader和Writer代表的等级结构内部,有一些流处理器可以对另一些流处理器起到装饰作用,形成新的,具有改善了的功能的流处理器。

代理模式

jdk中的应用

jdk中的Proxy类

解释和代码

Proxy类可以动态代理生成代理对象

原型模式

jdk中的应用

java的clone方法

解释和代码

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能
clone是基于内存级别的复制。不是用构造方法。创建重复对象性能更高

模板模式

jdk中的应用

java.io.InputStream, java.io.OutputStream, java.io.Reader和java.io.Writer的所有非抽象方法
java.util.AbstractList, java.util.AbstractSet和java.util.AbstractMap的所有非抽象方法

解释和代码

父类实现关键步骤,子类实现了具体步骤

外观模式

jdk中的应用

java.lang.Class
java的三层开发模式

解释和代码

Class.forName方法生成一个Class对象。作为对对象操作的总入口。

建造者模式

jdk中的应用

java.lang.StringBuilder
java.lang.StringBuffer

解释和代码

StringBuilder和Stringbuffer可以扩展原对象不同的字符串也可以按不同的顺序拼接

观察者模式

jdk中的应用

java.util.Observer接口

解释和代码

这个接口好像我平时开发没用到。他的所有实现类都是在sun包的。

状态模式

jdk中的应用

java.util.Iterator

解释和代码

根据一个指针的状态而改变自己的行为

适配器模式

jdk中的应用

java.util.Arrays.asList()
java.io.InputStreamReader(InputStream)

解释和代码

将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
Arrays将集合转换为list。Inputstream转换成reader

备忘录模式

jdk中的应用

解释和代码

组合模式

jdk中的应用

java.util.Map#putAll(Map)
java.util.List#addAll(Collection)
java.util.Set#addAll

解释和代码

组合模式用于把一组相似的对象当作一个单一的对象。和对象组合成集合一致

迭代器模式

jdk中的应用

java.util.Iterator
java.util.Enumeration

解释和代码

提供一个一致的方法来顺序访问集合中的对象,这个方法与底层的集合的具体实现无关。

单例模式

jdk中的应用

java.lang.Runtime
。。。。

解释和代码

private static Runtime currentRuntime = new Runtime();  
public static Runtime getRuntime() {  
    return currentRuntime;  

桥接模式

jdk中的应用

java.sql.DrivenManager

解释和代码

clipboard.png
通过上图可以看出,基于JDBC的应用程序,使用JDBC的API,相当于是对数据库操作的抽象的扩展,算作桥接模式的抽象部分;而具体的接口实现是由驱动来完成的,驱动这边自然就相当于桥接模式的实现部分了。而桥接的方式,不再是让抽象部分持有实现部分,而是采用了类似于工厂的做法,通过DriverManager来把抽象部分和实现部分对接起来,从而实现抽象部分和实现部分解耦

命令模式

jdk中的应用

java.lang.Runable和线程池

解释和代码

Runnable:任务抽象,也就是“命令”;线程池通过submit,execute调用

职责链模式

jdk中的应用

jsp servlet 的 Filter

解释和代码

多个过滤器过滤,满足条件则跳转入下一个过滤器

中介者模式

jdk中的应用

线程池的executer.execute方法
我觉得mvc模式可能更好理解

解释和代码

Controller作为view和model的中介。使model和view透明化转换

享元模式

jdk中的应用

java.lang.String

解释和代码

享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。String的常量池正是如此

解释器模式

jdk中的应用

java.util.Pattern
java.text.Normalizer
java.text.Format

解释和代码

这个模式通常定义了一个语言的语法,然后解析相应语法的语句。简单地说就是规定了格式

访问者模式

jdk中的应用

javax.lang.model.element.AnnotationValue和AnnotationValueVisitor
javax.lang.model.element.Element和ElementVisitor
javax.lang.model.type.TypeMirror和TypeVisitor

解释和代码

好像都没用过。。。。以后补上

空对象模式

jdk中的应用

java.util.Collections#emptyList()
java.util.Collections#emptyMap()
java.util.Collections#emptySet()

解释和代码

一个空对象取代 NULL


编程之路
一个人的成功不在于懂得多少,而在于坚持了多久

已工作的应届生。希望能和大家多多交流技术问题,

494 声望
23 粉丝
0 条评论
推荐阅读
protobuf优缺点
时间开销: XML格式化(序列化)的开销还好;但是XML解析(反序列化)的开销就不敢恭维了。 但是protobuf在这个方面就进行了优化。可以使序列化和反序列化的时间开销都减短。

木木甫阅读 5k

刨根问底 Redis, 面试过程真好使
充满寒气的互联网如何在面试中脱颖而出,平时积累很重要,八股文更不能少!下面带来的这篇 Redis 问答希望能够在你的 offer 上增添一把🔥。

菜农曰17阅读 973

封面图
PHP转Go实践:xjson解析神器「开源工具集」
我和劲仔都是PHP转Go,身边越来越多做PHP的朋友也逐渐在用Go进行重构,重构过程中,会发现php的json解析操作(系列化与反序列化)是真的香,弱类型语言的各种隐式类型转换,很大程度的减低了程序的复杂度。

王中阳Go10阅读 2k评论 3

封面图
万字详解,吃透 MongoDB!
MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常...

JavaGuide5阅读 847

封面图
计算机网络连环炮40问
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~

程序员大彬8阅读 1.1k

与RabbitMQ有关的一些知识
工作中用过一段时间的Kafka,不过主要还是RabbitMQ用的多一些。今天主要来讲讲与RabbitMQ相关的一些知识。一些基本概念,以及实际使用场景及一些注意事项。

lpe2348阅读 1.9k

封面图
Git操作不规范,战友提刀来相见!
年终奖都没了,还要扣我绩效,门都没有,哈哈。这波骚Git操作我也是第一次用,担心闪了腰,所以不仅做了备份,也做了笔记,分享给大家。问题描述小A和我在同时开发一个功能模块,他在优化之前的代码逻辑,我在开...

王中阳Go5阅读 2.3k评论 2

封面图

已工作的应届生。希望能和大家多多交流技术问题,

494 声望
23 粉丝
宣传栏