![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式
文章平均质量分 82
skyline_wx
这个作者很懒,什么都没留下…
展开
-
备忘录模式与编辑器
通过编辑器的例子了解备忘录模式备忘录模式编辑器三级目录备忘录模式备忘录模式是一种行为设计模式,允许在不暴露对象细节的情况下保存和恢复对象之前的状态编辑器备忘录就是典型的存读档模式。存档,保存当前游戏进度以及人物信息等;读档,恢复游戏进度和人物信息等操作。三级目录...原创 2022-04-04 22:48:32 · 287 阅读 · 0 评论 -
原型模式与深拷贝浅拷贝
原型模式与深拷贝浅拷贝原型模式Java中的原型模式简单的例子浅拷贝深拷贝效率比较原型模式用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。使用这种方式创建对象非常高效,根本无需知道对象创建的细节。这让我想到了docker的镜像Java中的原型模式Java自带了原型模式clone()方法,但是使用clone()方法有两个条件重写父类(Object类)的clone方法,将clone设置为public的实现标记性接口Cloneable简单的例子publi原创 2022-03-24 22:44:57 · 512 阅读 · 0 评论 -
点菜系统中的命令模式
点菜系统中的命令模式现实生活中的命令模式命令模式三级目录现实生活中的命令模式首先我们来回顾一下去饭店吃饭是如何点菜的:服务员来给我们看下菜单我们告诉服务员我要什么菜服务员告诉厨师要做什么菜上菜在整个流程中,实际做菜的厨师并没有与我们进行交互,取而代之的是服务员。服务员与我们沟通后,将沟通的结果告诉厨师,厨师做菜,服务员上菜。这样做有什么好处呢?好处是专人专责。厨师只负责做菜做菜做菜,其他的工作由服务员来做,这样就提高了厨师的工作效率,使厨师可以专注于做菜这一件事儿。命令模式命令模式是一原创 2022-03-17 23:07:42 · 842 阅读 · 0 评论 -
灯的演化与桥接模式
灯的演化与桥接模式灯桥接模式实践ILightTube 灯管AbstractLight 抽象的灯灯在功能方面的扩展灯在材料方面的扩展BridgeMain运行结果总结灯在了解桥接模式之前,我们先来看看灯。从材料的角度看,灯管是灯的核心从功能和使用场景看,单纯的灯又能分为台灯、吊灯等这样一组合,仅仅是按照上面的图中的场景算,也有6种组合了。针对上面这种业务场景,我们在程序中应该如何应对呢?桥接模式桥接模式将抽象部分与它的实现部分分离开来,使他们都可以独立变化。桥接模式将类之间静态的继承关系转化原创 2022-01-30 22:33:29 · 1091 阅读 · 0 评论 -
使用适配器模式将异构系统同构化
使用适配器模式将异构系统同构化原创 2022-01-26 23:28:33 · 489 阅读 · 0 评论 -
做晚饭与建造者模式
做晚饭与建造者模式建造者模式做晚饭SimpleBuilder反思可复用的建造者抽象的建造者 BaseMealBuilder具体的建造者 FatherMealBuilder & MotherMealBuilder指挥者 Baby使用总结建造者模式是一个相对比较简单的设计模式,我们都知道建造者模式是用来创建对象的。接下来我们用做晚饭的例子来全面的了解一下建造者模式。建造者模式建造者设计模式可以使一个复杂对象的构造与它的表示分离,让同样的构造过程可以创建不同的表示。它将一个复杂的对象分解为多个简单的原创 2022-01-21 23:33:41 · 486 阅读 · 0 评论 -
使用访问者模式给抽象语法树打印逆波兰式和彩虹括号
使用访问者模式给抽象语法树整活访问者模式需求程序改造定义访问者接口对节点进行少量的改造实现Rainbow Brackets实现逆波兰式打印Main运行结果思考在上一篇文章中,为了给访问者模式做铺垫,我从零开始撸一个抽象语法树出来,今天我们用访问者模式给语法树整点活。访问者模式访问者模式是一种行为设计模式,它将算法与其所作用的对象隔离开来。通过这种方式,元素的执行算法可以随着访问者的改变而改变。对于Java而言,访问者模式为我们提供了双重分派的功能。需求访问者模式的概念说起来有点绕,我们先看看这次改原创 2022-01-19 22:41:59 · 524 阅读 · 0 评论 -
如何搞一个支持自定义函数和变量的四则运算的抽象语法树出来
从零开始撸一个抽象语法树出来楔子需求思考BNF范式BNF范式应用回顾实现公共的Node节点表达式节点 Expression静态变量节点 StaticNode数据节点 DataNode函数节点 FunctionNode操作符节点 Operator加法处理节点 Add减法处理节点 Minus乘法处理节点 Multiply除法处理节点 Divide自定义函数扩展函数接口 IFunction函数参数说明 FunctionParam自定义函数 Max自定义函数 Plus100入口测试测试样例测试结果总结楔子本来最原创 2022-01-18 16:44:17 · 721 阅读 · 0 评论 -
容器遍历新姿势,迭代器模式
容器遍历新姿势,迭代器模式迭代器模式理解一个图书馆的例子迭代器接口图书馆对象main执行结果思考迭代器模式提供一种方法,顺序访问集合中的各种元素,而又不暴露该对象的内部表示。理解迭代器的精髓就是,我是一个容器,但是我不告诉你我具体是用什么实现的容器,同时,我给你一个对象,你可以用这个对象来遍历我这个容器。迭代器模式很好的体现了封装和面向接口的编程思想。一个图书馆的例子我们都知道图书馆里会有很多本书。那么图书馆也算是一种容器,接下来我们用图书馆的例子来看看迭代器模式。迭代器接口首先我们定义一原创 2022-01-14 22:35:32 · 330 阅读 · 0 评论 -
使用代理模式手写简单的数据库连接池
使用代理模式手写简单的数据库连接池JDBC直连数据库思考改造ConnectionProxyConnectionPoolProxyMain运行结果代理模式与装饰器的区别JDBC直连数据库我们都知道要连接数据库需要使用JDBC,所以我们先看个简单的demo。下面这个例子单纯的使用JDBC连接数据库并查询其中的数据/** * 代理 * @author skyline */public class JDBCMain { private static final Logger logger =原创 2022-01-08 15:58:29 · 1016 阅读 · 0 评论 -
内存优化利器,享元模式
内存优化利器,享元模式需求子弹的抽象规格各种具体的规格子弹与子弹工厂生产子弹问题思考改造享元模式字符串常量池总结在了解什么是享元模式之前,我们先来看个问题。需求我们需要创建一个兵工厂,这个兵工厂复制生产各种型号的子弹。每个子弹都需要型号说明和自己独一无二的标识。然后我用下面的代码实现了一份出来。子弹的抽象规格/** * 子弹规格,抽象对象 */public abstract class BulletSpecification { /** * 口径,mm * @r原创 2022-01-01 21:29:24 · 387 阅读 · 5 评论 -
订单与组合模式
订单与组合模式订单组合模式代码定义顶层接口一些具体的商品苹果笔记本牛奶茶叶订单main总结订单订单在我们的日常生活中非常常见。有时候一个订单中会包含其他的订单,就像下面这样:在order订单中包含了两个子订单和一瓶牛奶,两个子订单又分别有自己的内容。这样就形成了一个订单树,具体的商品是叶子节点,订单是非叶子节点。就像下面这样:那么我们应该怎么处理这种树形结构呢?答案就是使用组合模式组合模式组合模式是一种结构型设计模式,你可以使用它将对象组合成树状结构,并且能够像使用独立对象一样使用它们,所以原创 2021-12-25 23:07:56 · 651 阅读 · 0 评论 -
过滤器与责任链模式
过滤器与责任链模式Filter责任链模式通过责任链对消息进行处理源码结果反思与思考Servlet中的Filter模拟Servlet中Filter的处理模式demo效果Filter说起Filter大家应该都不陌生。Filter一般用于Servlet处理之前做一些前置的校验。如果校验通过,那么调用chain.doFilter(request, response)就可以让下一个filter继续执行逻辑。Filter是责任链模式的一种应用。接下来我们将探索、模拟Filter的实现逻辑。责任链模式责任链模式是原创 2021-12-23 21:50:46 · 1844 阅读 · 0 评论 -
事件中心与观察者模式
事件中心与观察者模式楔子观察者模式事件中心demo被观察者具体的事件观察者具体事件的具体观察者主题具体的主题—>事件中心验证事件中心总结楔子event一种我们在代码中经常使用的对象。我们通过一定的方式创建出一个event,然后调用上下文将event发送出去。对应的listener就会收到消息并执行响应的逻辑。我们都知道这种基于“事件”的开发中,用到设计模式就是观察者模式(也叫发布订阅模式),那么什么是观察者模式呢?观察者模式观察者模式是一种行为设计模式,允许你定义一种订阅机制,可在对象时间发原创 2021-12-15 22:58:58 · 1142 阅读 · 0 评论 -
咖啡馆与装饰模式
咖啡馆与装饰模式需求思考装饰模式的定义代码样例原材料基类然后扩展一些我们会用到的原材料最后,我们来生产咖啡吧总结需求楼下的咖啡馆要开业了,我们看看他们主营的产品有哪些:热牛奶高乐高摩卡卡布奇诺…然后,咖啡馆的需求就来了:产品不同,售价也不同。同时作为咖啡馆,经常需要推出新品。思考看到这个需求,第一反应是通过继承来解决这些问题。解决思路如下:我们先定义一个饮料的基类扩展这个基类,生成热牛奶、高乐高、摩卡等子类通过工厂的方式返回这些子类(也就是生成饮料)。这也算是一种中规中矩原创 2021-12-13 22:52:03 · 443 阅读 · 0 评论 -
红绿灯与调停者模式
红绿灯与调停者模式生活中的例子调停者说明代码样例总结生活中的例子 我们每天都会过马路,当十字路口有红绿灯时,我们只需要等绿灯亮就可以安心的走了。但是如果没有红绿灯,我们在过马路时就需要仔细多了。我们需要不停的观察路上行驶的车辆,小心谨慎的走,直到穿过马路。 将上面的例子类比到代码的世界里,不管是人还是车辆都可以算作是原创 2021-12-03 21:50:41 · 379 阅读 · 0 评论 -
从新生入学流程的例子看门面模式
应对复杂第三方系统的利器——门面模式门面模式说明优点缺点例子定义门面提供具体的实现类与具体的逻辑使用门面结果总结常见的门面模式门面模式说明门面模式是一种构造型设计模式,能为程序库、框架或其他复杂类提供一个简单接口优点你可以让自己代码独立于复杂的子系统缺点外观类可能会成为程序中与所有类都耦合的上帝对象如果设计不当,当子系统新增功能时,可能会需要修改门面类,这样就违背了开闭原则例子接下来我们通过这个新生入学流程的例子来体会一下门面模式的有点与缺点定义门面我们定义一个学校的门面,这个原创 2021-11-30 22:10:40 · 290 阅读 · 0 评论 -
从餐具的生产说到抽象工厂
从餐具的生产说到抽象工厂什么是抽象工厂理解餐具工厂总结与工厂方法的对比在上一篇文章中我们探索和了解了什么是工厂模式,接下来我们继续深入到抽象工厂什么是抽象工厂抽象工厂模式是一种创建型设计模式,它能创建一系列相关的对象,而无需指定其具体类理解我对抽象工厂模式的理解是为了创建一套一套的产品而存在的工厂模式。比如:网页风格可以使用抽象工厂模式,一键换肤,朋克画风、Q版画风、极简画风等。游戏中的地图风格也可以使用抽象工厂模式,熔岩地图、冰雪地图、沙漠地图等。餐具生产厂商也可以使用抽象工厂模式,生产原创 2021-11-26 22:27:31 · 346 阅读 · 0 评论 -
从筷子的生产说到工厂方法
从筷子的生产说工厂方法理解筷子生产线定义产品接口定义工厂接口定义具体的工厂和产品竹筷子工厂和竹筷子木筷子工厂和木筷子使用工厂工厂方法工厂方法是一种创建型生产模式。在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型。理解按照我的理解,工厂方法主要的意图是隐藏new方法,封装对象的创建方法,让使用者更关注对象本身,而不是如何创建这个对象。接下来我们用筷子生产线的例子来感受一下工厂方法。筷子生产线定义产品接口首先我们定义一下产品的接口,也就是筷子/** * @author wangx原创 2021-11-25 22:29:42 · 347 阅读 · 0 评论 -
从排序方式说策略模式
从排序方式说策略模式起因需求的第二轮需求的第三轮需求的第四轮策略模式程序改造总结优点[^1]缺点适用场景起因今天来了一个需求,说是要对一个给定的整型数组进行排序,机智如我,很快就写完了:public class Main { private static final Logger logger = LoggerFactory.getLogger(Main.class); public static void main(String[] args) { int[] te原创 2021-11-10 22:26:20 · 529 阅读 · 0 评论 -
单例模式的四种写法以及与效率评测
好久没继续了…设计模式——单例模式单例模式入门版双重校验版holder写法神级写法总结单例模式单例模式是一种常用的软件设计模式,属于创建模式的一种。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。1入门版我们先看下最接地气的版原创 2021-11-07 16:35:07 · 201 阅读 · 0 评论