
设计模式
文章平均质量分 75
23种经典面向对象设计模式
天航星
天河有尽后为涯,星海无边前作岸。
展开
-
设计模式 00 设计原则
参考源面向对象设计原则在进行软件开发时,不仅需要将基本的业务完成,还要考虑整个项目的和。因此在编写代码时,应该尽可能的规范,不然随着项目的不断扩大,整体结构只会越来越遭。为了避免这种情况的发生,应该尽量遵守。原创 2022-07-06 11:19:32 · 274 阅读 · 0 评论 -
设计模式 01 单例模式
单例就是只有一个实例对象,即在整个程序中,同一个类始终只有一个对象进行操作。这样可以极大的减少内存开支和系统的性能开销,因此应用十分广泛。比如数据库连接类,实际上只需要创建一个对象或是直接使用静态方法就可以了,没必要去创建多个对象。这种模式提供了一种创建对象的最佳方式,让类负责创建自己的对象,同时确保只有单个对象被创建。这个类需要提供访问其唯一对象的方式,且可以直接访问,不需要实例化该类的对象。为保证只能由自己创建对象,单例类必须构造方法私有化。单例类必须自己创建自己的唯一实例。原创 2022-07-09 10:57:34 · 198 阅读 · 0 评论 -
设计模式 02 工厂模式
如果所有的对象都通过 new 的方式去创建,那么当程序中大量使用此对象时,突然有一天这个对象的构造方法或是类名发生了修改,那就得逐个去进行修改。这样,就可以使用不同类型的工厂来生产不同类型的水果了,如果新增了水果类型,直接创建一个新的工厂类就行,不需要修改之前已经编写好的内容。当需要对象时,直接调用工厂类中的工厂方法来生成对象,这样,就算类出现了变动,只需要修改工厂中的代码即可,而不是大面积地进行修改。此时如果需要新增一种水果,比如桃子,那么就得去修改工厂提供的工厂方法了,这样是不太符合开闭原则的。原创 2022-07-10 11:47:00 · 107 阅读 · 0 评论 -
设计模式 03 抽象工厂模式
不过,缺点还是有的,如果产品族新增了产品,那么我就不得不去为每一个产品族的工厂都去添加新产品的生产方法,违背了开闭原则。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类,每个生成的工厂都能按照工厂模式提供对象。比如小米,那么就创建一个小米工厂,这个工厂里面可以生产整条产品线上的内容,包括小米手机、小米平板等。一个工厂可以生产同一个产品族的所有产品,这样按族进行分类,显然比之前的工厂模式更好。抽象工厂模式是围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。原创 2022-07-11 10:04:00 · 159 阅读 · 0 评论 -
设计模式 04 建造者模式
参考源建造者模式(Builder Pattern)属于模式建造者模式使用多个简单的对象一步一步构建成一个复杂的对象。经常使用的就是建造者模式的典型实现。原创 2022-07-12 21:07:00 · 178 阅读 · 0 评论 -
设计模式 05 原型模式
无论是基本类型还是引用类型,深拷贝会将引用类型的所有内容,全部拷贝为一个新的对象,包括对象内部的所有成员变量,也会进行拷贝。可以看到,虽然 Student 对象成功拷贝,但是其内层对象并没有进行拷贝,依然只是对象引用的复制。可以看到, Student 对象和其中的属性 name 都进行了拷贝,是完全不一样的对象了。也就是说,原型对象作为模板,通过克隆操作,来产生更多的对象,就像细胞的复制一样。对于引用类型,只会复制对象的地址,而实际上指向的还是原来的那个对象。2、来看看克隆的对象是不是原来的对象。原创 2022-07-21 22:48:00 · 113 阅读 · 0 评论 -
设计模式 06 适配器模式
结构型模式关注如何将现有的类或对象组织在一起形成更加强大的结构。在生活中,我们经常遇到这样的一个问题:轻薄笔记本通常只有 type-c 或者 usb-a 接口,没有网口。但日常使用中是往往需要连接网口上网的,这时想到的第一个解决方案,就是去买一个转接头或者扩展坞。它们可以将 type-c 或者 usb-a 转换为其他类型的接口供我们使用,实际上这就是一种适配器模式。我们常用的充电头,为什么叫电源适配器呢?原创 2023-08-23 16:33:35 · 1609 阅读 · 0 评论 -
设计模式 07 桥接模式
桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。比如需要创建电脑对象,市面上的电脑非常多,品牌有华为、苹果、联想等等,类型有台式、笔记本、平板等等。如果给每个品牌的每个类型的电脑都创建一个对象,那是十分繁琐的,而且非常不方便扩展。试想如果增加了一个品牌或者类型,那就需要增加大量的对象,这无疑是笨重和低效的。这时我们会想,如果给品牌和类型。原创 2023-08-24 13:54:33 · 1487 阅读 · 0 评论 -
设计模式 08 代理模式
代理模式就是一个代理对象来间接访问对象,常用于无法直接访问某个对象或访问某个对象不方便的情况。实际上代理在生活中处处都存在,比如房屋中介就是代理,Apple 的授权经销商就是代理,访问国外网站所用的代理服务器也是代理,Spring 框架的 AOP 也是通过代理模式实现的。这些代理都有一个共同特点,就是使用的一致性和中间环节的透明性,也就是说找代理做的事情需要与找对象本身做的事情是一样的,只是中间环节隐藏了而已。代理模式分为静态代理和动态代理。原创 2022-07-30 17:19:00 · 156 阅读 · 0 评论 -
设计模式 09 组合模式
比如文件夹,一个文件夹中可能包含有很多个子文件夹或是文件。它就像是一个树形结构一样,有分支有叶子,而组合模式则是可以对整个树形结构上的所有节点进行递归处理,比如我们现在希望将所有文件夹中的文件的名称前面都添加一个前缀,那么就可以使用组合模式。可以看到对最外层目录进行操作后,会递归向下处理当前目录和子目录中所有的文件。实际上就是将多个组件进行组合,让用户可以对它们进行一致性处理。组合模式(Composite Pattern)属于。原创 2022-08-01 21:59:00 · 92 阅读 · 0 评论 -
设计模式 10 装饰器模式
装饰,顾名思义,就是在原有基础上增添东西以显示更好的效果。生活中非常多这样的例子,衣服饰品珠宝首饰房子装修都是在进行装饰。开发中这样的情况也非常多,比如用户的性别在数据库表中一般都是存的编码,然后通过字典表进行翻译,进而在页面展示为男、女。原创 2022-08-10 21:34:00 · 100 阅读 · 0 评论 -
设计模式 11 外观模式
在生活中,经常遇到这样的情况:办理一个业务,需要找很多部门签字盖章,这些部门往往距离较远,无奈只得四处奔波。这时候相信所有人都有一个同样的诉求:要是找一个部门就能办理完所有业务就好了!编程来源于生活,生活中是这样,代码中也是这样。如果一个业务逻辑需要调几个独立的系统,不仅编写复杂,还不方便管理和维护,任意系统的业务变更都将影响很多地方。这时也是同样的诉求,要是调一个系统就能解决业务就好了!这时外观模式就应运而生了,它隐藏了各系统间调用的复杂性,并向客户端提供了可以一次访问就实现各系统间逻辑的接口。原创 2022-08-11 22:28:00 · 88 阅读 · 0 评论 -
设计模式 12 享元模式
享元,英文名称为Flyweigh轻量级的意思。它通过与其他类似对象共享数据来减小内存占用,也就是它名字的来由:享-分享。大家都知道围棋有黑白子,用程序定义一局围棋时,如果给每颗黑子和每颗白子都定义一个对象,那一局围棋会产生大量的对象,这样有必要吗?每颗黑子都是类似的,每颗白子也是类似的,完全可以只定义一颗黑子对象和一颗白子对象,其余的棋子都复用这两个对象,这样不仅节省空间,编写也会简单很多,这就是享元模式的思想。原创 2022-08-12 23:52:00 · 258 阅读 · 0 评论 -
设计模式 13 解释器模式
解释器模式是指给定一门语言, 基于它的语法, 定义解释器来解释语言中的句子。是一种按照规定的语法进行解析的模式。就比如编译器可以将源码编译解释为机器码, 让 CPU 能进行识别并运行。解释器模式的作用其实与编译器一样,都是将一些固定的语法进行解释,构建出一个解释句子的解释器。解释器是一个语法分析工具,它可以识别句子语义,分离终结符号和非终结符号,提取出需要的信息,针对不同的信息做出相应的处理。其核心思想是识别语法,构建解释。原创 2022-08-13 17:44:00 · 173 阅读 · 0 评论 -
设计模式 14 模板模式
在生活中常常会遇到这样的情况,做某一件事情,有些步骤是固定的,有些步骤的变化的。比如去医院看病,挂号和排队这两个步骤是固定的,不管是什么病到了医院都得遵循这两个步骤;但是后续的检查和治疗这两个步骤是变化的,不同的病需要采用不同的检查方式,然后采取不同的治疗手段。针对这一情况,在设计去医院看病这一程序时可以这样实现:定义一个抽象类,固定的步骤用普通方法实现,变化的步骤定义为抽象方法,由子类继承实现。这样就可以根据不同的子类来实现不同的变化步骤,这就是模板模式。原创 2022-08-14 14:42:00 · 86 阅读 · 0 评论 -
设计模式 15 责任链模式
责任链,即责任的链条,在生活中是很常见的。比如在工作中提交审批,会经历责任人的层层审批,最后才会通过,这一审批流程就是责任链。再比如,JavaWeb 中学习的 Filter 过滤器,正是采用的责任链模式,通过将请求一级一级不断向下传递,来对所需要的请求进行过滤和处理。运用责任链模式,可以让整个流程变得更加清晰,且每个环节的调用顺序可以灵活的调整,利于维护和扩展。原创 2022-08-14 15:56:00 · 189 阅读 · 0 评论 -
设计模式 16 命令模式
现在各大电子厂商都在推智能家居,即可以通过手机这一个终端控制多个家用电器,比之前的单个设备智能由对应遥控器控制的方案要方便很多。这其实就是命令模式的应用。命令模式将请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。原创 2022-08-14 17:30:00 · 149 阅读 · 0 评论 -
设计模式 17 迭代器模式
迭代器模式是 Java 中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,而不需要知道集合对象的底层表示。迭代器是学习 Java 语言的基础,没有迭代器,集合类的遍历就成了问题,正是因为有迭代器的存在,才能更加优雅的使用 foreach 语法。Java 中的增强 for 循环是使用迭代器实现的// 使用 foreach 语法糖进行迭代,依次获取每一个元素// 打印元素// 这里本质是通过 List 生成的迭代器来遍历每个元素的// 判断是否还有元素可以迭代,没有就返回false。原创 2022-08-14 18:17:00 · 183 阅读 · 0 评论 -
设计模式 18 中介者模式
一提到中介,大家都非常熟悉,生活中最常见的就是房屋中介。虽然中介要收取一定费用,但却能给房东和租客都提供大量遍历,房东只需要把房屋信息提供给中介,租客也只需要将租金交给中介,由中介处理中介环节,给两方都提供了便利。这就是中介模式的应用。原创 2022-08-14 19:21:00 · 173 阅读 · 0 评论 -
设计模式 19 备忘录模式
我们的生活一旦留下遗憾,不管多么悔恨、多么懊恼、多么渴望,往往都回不去了!程序虽然来源于生活,有时候也能高于生活,比如遗憾,在程序中就是能补救的。游戏中有存档和读档,设计模式中也有备忘录模式可以实现。备忘录模式就是为程序提供了一个可回溯的时间节点,如果程序在运行过程中某一步出现了错误,就可以回到之前的某个被保存的节点上重新来过(就像艾克的大招)。平时编辑文本的时候,当编辑出现错误时,就需要撤回,此时只需要按下 Ctrl + Z 就可以回到上一步,这样大大方便了文本编辑。原创 2022-08-15 21:24:00 · 163 阅读 · 0 评论 -
设计模式 20 观察者模式
在 Java 中,一个对象的状态发生改变,就可能会影响到其他的对象,与之相关的对象可能也会联动的进行改变。比如监听器机制,当具体的事件触发时,可以在创建的监听器中执行相关的逻辑。观察者模式可以实现这样的功能,当对象发生改变时,观察者能够立即观察到并进行一些联动操作。这里以监听主体改变为例来介绍观察者模式:1、定义观察者/*** 观察者*//*** 更新操作*/2、定义观察者实现类/*** 观察者实现类*/@Override。原创 2022-08-16 21:36:00 · 131 阅读 · 0 评论 -
设计模式 21 状态模式
在标准大气压下,水在 0 ~ 100 度之间时,会呈现液态;在 0 度以下会变成固态;100 度以上会变成气态。物质在不同的条件下呈现不同的状态,对象可能也会像这样存在很多种状态,在不同的状态下可能会有不同的行为,可以通过状态模式来实现这样的效果。原创 2022-08-17 21:43:00 · 145 阅读 · 0 评论 -
设计模式 22 策略模式
生活中会面临很多抉择,每一个抉择会导向不同的结果,这时就会出现策略的选择。程序中也是一样,而且更加复杂,生活中的抉择一般只有几个,但程序中可能有十多个甚至数十个,也就是我们常用的if-else或者switch。当只有少量选择时,用这些没有问题,但一旦量比较大,代码的可读性和维护难度会迅速上升,这时候就建议使用策略模式了。原创 2022-08-24 19:02:00 · 141 阅读 · 0 评论 -
设计模式 23 访问者模式
生活中经常会有这样的情况,同样的事物不同人有完全不同的感受,正所谓一千个读者一千个哈姆雷特。程序中也是一样,往往不同的访问者会有不同的行为以及结果,这就是访问者模式。原创 2022-08-24 21:05:00 · 165 阅读 · 0 评论