
设计模式
文章平均质量分 85
设计模式
ximeneschen
这个作者很懒,什么都没留下…
展开
-
JDK里的设计模式
一、结构型模式 适配器模式:用来把一个接口转化成另一个接口。 java.util.Arrays#asList() javax.swing.JTable(TableModel) java.io.InputStreamReader(InputStream) java.io.OutputStreamWriter(OutputStream) javax.xml.bind.annotation.adapters.XmlAdapter#marshal() javax.xml.bind.annotation.adap原创 2021-09-27 14:51:57 · 107 阅读 · 0 评论 -
策略模式
一、策略模式 策略模式用一个成语就可以概括 —— 殊途同归。当我们做同一件事有多种方法时,就可以将每种方法封装起来,在不同的场景选择不同的策略,调用不同的方法。策略模式(Strategy Pattern):定义了一系列算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。 二、例子 我们以排序算法为例。排序算法有许多种,如冒泡排序、选择排序、插入排序,算法不同但目的相同,我们可以将其定义为不同的策略,让用户自由选择采用哪种策略完成排序。 首先定义排序算法接口:原创 2021-09-01 11:16:18 · 145 阅读 · 0 评论 -
状态模式
一、状态模式 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类)通俗地说,状态模式就是一个关于多态的设计模式。如果一个对象有多种状态,并且每种状态下的行为不同,一般的做法是在这个对象的各个行为中添加 if-else 或者 switch-case 语句。但更好的做法是为每种状态创建一个状态对象,使用状态对象替换掉这些条件判断语句,使得状态控制更加灵活,扩展性也更好。 例如 if (state == STATUS1) { action1(); } else if (state原创 2021-09-01 09:50:41 · 1014 阅读 · 0 评论 -
迭代器模式
一、迭代器模式 提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式(Iterator)实际上在Java的集合类中已经广泛使用了。我们以List为例,要遍历ArrayList,即使我们知道它的内部存储了一个Object[]数组,也不应该直接使用数组索引去遍历,因为这样需要了解集合内部的存储结构。如果使用Iterator遍历,那么,ArrayList和LinkedList都可以以一种统一的接口来遍历。 二、例子 设想一个场景:我们有一个类中存在一个列表。这个列表需要提供给外原创 2021-08-31 17:15:03 · 313 阅读 · 0 评论 -
模板方法模式
一、模板方法模板 模板方法模式(Template Method Pattern):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。通俗地说,模板方法模式就是一个关于继承的设计模式。每一个被继承的父类都可以认为是一个模板,它的某些步骤是稳定的,某些步骤被延迟到子类中实现。这和我们平时生活中使用的模板也是一样的。比如我们请假时,通常会给我们一份请假条模板,内容是已经写好的,只需要填写自己的姓名和日期即可。 本人 ___ 因 ___ 需原创 2021-08-31 16:32:57 · 87 阅读 · 0 评论 -
观察者模式
一、观察者模式 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。观察者模式(Observer)又称发布-订阅模式(Publish-Subscribe:Pub/Sub)。它是一种通知机制,让发送通知的一方(被观察方)和接收通知的一方(观察者)能彼此分离,互不影响。 二、例子 观察者模式非常常见,近年来逐渐流行的响应式编程就是观察者模式的应用之一。观察者模式的思想就是一个对象发生一个事件后,逐一通知监听着这个对象的监听者,监听者可以对这个事件马上做出响应。原创 2021-08-31 14:48:26 · 337 阅读 · 0 评论 -
设计模式使用率排行榜
使用频率 所属类型 模式名称 模式 简单定义 5 创建型 Singleton 单件 保证一个类只有一个实例,并提供一个访问它的全局访问点。 5 结构型 Composite 组合模式 将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性。 5 结构型 FACADE 外观 为子系统中的一组接口提供一致的界面,facade提供了一高层接口,这个接口使得子系统更容易使用。 5 结构型 Proxy 代理 为其他对象提供一种代理以控制对这个...转载 2021-08-31 10:47:40 · 481 阅读 · 0 评论 -
代理模式(为对象提供相同的接口)
一、代理模式 代理模式,即Proxy,让你能够提供对象的替代品或其占位符。 代理控制着对于原对象的访问, 并允许在将请求提交给对象前后进行一些处理。它和Adapter模式很类似。我们先回顾Adapter模式,它用于把A接口转换为B接口: public BAdapter implements B { private A a; public BAdapter(A a) { this.a = a; } public void b() { a.a();原创 2021-08-31 01:14:22 · 369 阅读 · 0 评论 -
享元模式
一、享元模式 享元模式:摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,让你能在有限的内存容量中载入更多的对象,体现的是程序可复用 的特点,为了节约宝贵的内存,程序应该尽可能地复用。 享元的核心思想很简单:如果一个对象实例一经创建就不可变,那么反复创建相同的实例就没有必要,直接向调用方返回一个共享的实例就行,这样即节省内存,又可以减少创建对象的过程,提高运行速度。 二、例子 享元模式在Java标准库中有很多应用。我们知道,包装类型如Byte、Integer都是不变类,因此,反复创建同原创 2021-08-31 00:36:23 · 192 阅读 · 0 评论 -
外观模式
一、外观模式(门面模式) 外观模式非常简单,体现的就是 Java 中封装的思想。将多个子系统封装起来,提供一个更简洁的接口供外部调用。 外观模式:外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式。 二、例子 举个例子,比如我们每天打开电脑时,都需要做三件事: 打开浏览器 打开 IDE 打开微信 每天下班时,关机前需要做三件事: 关闭浏览器 关闭 IDE 关闭微信 用程序原创 2021-08-31 00:03:45 · 183 阅读 · 0 评论 -
装饰者模式(为对象提供加强的接口)
一、装饰者模式 装饰者模式:允许你通过将对象放入包含行为的特殊封装对象中来为原来的对象绑定新的行为,相比生成子类更加灵活。是一种在运行期动态给某个对象的实例增加功能的方法。如:在IO的Filter模式就使用了装饰器模式。在Java标准库中,InputStream是抽象类,FileInputStream、ServletInputStream、Socket.getInputStream()这些InputStream都是最终数据源。 二、例子 现在,如果要给不同的最终数据源增加缓冲功能、计算签名功能、加密解密功能原创 2021-08-30 23:39:34 · 336 阅读 · 0 评论 -
组合模式
一、组合模式 将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。组合模式(Composite)经常用于树形结构,为了简化代码,使用Composite可以把一个叶子节点与一个父节点统一起来处理。 我们来看一个具体的例子。在XML或HTML中,从根节点开始,每个节点都可能包含任意个其他节点,这些层层嵌套的节点就构成了一颗树。 要以树的结构表示XML,我们可以先抽象出节点类型Node: public interface Node { // 添加一个节点为子原创 2021-08-30 22:19:11 · 110 阅读 · 0 评论 -
桥接模式
一、桥接模式 桥接模式是一种结构型设计模式, 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构, 从而能在开发时分别使用。考虑这样一个需求:绘制矩形、圆形、三角形这三种图案。按照面向对象的理念,我们至少需要三个具体类,对应三种不同的图形。 抽象接口 IShape: public interface IShape { void draw(); } 三个具体形状类: class Rectangle implements IShape { @Override public voi原创 2021-08-30 16:56:53 · 425 阅读 · 0 评论 -
适配器模式(为被封装对象提供不同的接口)
一、适配器讲解 说到适配器,我们最熟悉的莫过于电源适配器了,也就是手机的充电头。它就是适配器模式的一个应用。试想一下,你有一条连接电脑和手机的 USB 数据线,连接电脑的一端从电脑接口处接收 5V 的电压,连接手机的一端向手机输出 5V 的电压,并且他们工作良好。中国的家用电压都是 220V,所以 USB 数据线不能直接拿来给手机充电,这时候我们有两种方案: 单独制作手机充电器,接收 220V 家用电压,输出 5V 电压。 添加一个适配器,将 220V 家庭电压转化为类似电脑接口的 5V 电压,再连接数原创 2021-08-30 14:21:20 · 1076 阅读 · 0 评论 -
原型模式
一、原型模式的定义与特点 原型(Prototype)模式的定义: 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。 原型模式的结构: 原型模式包含以下主要角色: 抽象原型类:规定了具体原型对象必须实现的接口。 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。 访问类:使用具体原型类中的 克隆方法来复制新的对象。 原型模式的实现: 原转载 2020-11-27 09:06:35 · 178 阅读 · 0 评论 -
建造者模式
一、建造者模式 核心思想:使用不同的类对他们的实例化操作逻辑进行封装,当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用建造者模式。当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。 解决的问题 当一个类的构造函数参数超过4个,而且这些参数有些是可选的时,我们通常有两种办法来构建它的对象。 例如我们现在有如下一个类计算机类Computer,其中cpu与ram是必填参数,而其他3个是可选参数,那么我们如何构造这个类的实例呢,通常有两种常用的方式:转载 2020-11-26 17:45:18 · 302 阅读 · 0 评论 -
工厂模式
工厂模式实现了创建者和调用者的分离,实现了更好的解耦。 一、详细分类: 简单工厂模式(静态工厂模式); 工厂方法模式; 抽象工厂模式 二、简单工厂模式 简单工厂模式最大的优点在于实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责,但是其最大的缺点在于工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码逻辑将会非常复杂。 下面以汽车为例介绍工厂模式: Car接口是汽车行为的抽象: Car.java源码如下: public interface Car {原创 2020-11-25 23:33:43 · 116 阅读 · 0 评论 -
单例模式
一、何为单例 保证一个类只有一个实例,哪怕是在多线程同时访问的情境下,并需要提供一个全局访问此实例的点。 注意: 单例类只能有一个实例 这个实例由自己创建 这个实例必须提供给外界 关键:构造器私有化,声明静态方法实现全局访问获得该单例实例 创建方法:单例模式按个人理解是有8种方式实现的,但主要可以分为支持懒汉式和非懒汉式实现。 饿汉式:在类的加载的时候就创建; 懒汉式:只有在我需要的时候才去创建; 二、思路及实现 (核心就是:构造器私有化,声明静态方法实现全局访问获得该单例实例)原创 2020-11-25 17:39:15 · 193 阅读 · 0 评论 -
23种设计模式及OOP7大原则
23种Java设计模式介绍 概述 设计模式是针对某一类问题的最优解决方案,是从许多优秀的软件系统中总结出的。Java中设计模式(java design patterns)通常有23种。模式可以分成3类:创建型、行为型和结构型。 创建型模式 创建型模式涉及对象的实例化,特点是不让用户代码依赖于对象的创建或排列方式,避免用户直接使用new创建对象。 创建型模式有以下5个:工厂方法模式 、抽象工厂方法模式、生成器模式、原型模式 、单例模式 行为型模式 行为型模式涉及怎样合理的设计对象之间的交互通信,以原创 2020-09-02 15:42:59 · 291 阅读 · 0 评论