设计模式
文章平均质量分 60
孔小乐
这个作者很懒,什么都没留下…
展开
-
行为型(十一) - 中介模式
借鉴下参考链接的例子航空管制,为了让飞机在飞行的时候互不干扰,每架飞机都需要知道其他飞机的实时位置,这就需要时刻跟其他飞机通信。很多架飞机相互通信就会变得很复杂,也容易出事,这时候我们需要增加一个中介飞行控制中心,获取每个飞机的实时位置并规划飞机航行路线。:中介模式定义了一个单独的(中介)对象,来封装一组对象之间的交互。将这组对象之间的交互委派给与中介对象交互,来避免对象之间的直接交互。原创 2023-08-23 11:19:43 · 95 阅读 · 0 评论 -
行为型(十) - 解释器模式
举个常见的面试题,输入这样一个字符串“6 3 5 7 - + * ”,中间空格隔开。前面是运算的数,后面是运算符。先取前两个数6 3,再取一个运算符-,6-3=3,然后用结果继续和后面的数进行计算3+5=8,8*7=56。:解释器模式为某个语言定义它的语法(或者叫文法)表示,并定义一个解释器用来处理这个语法。实际应用中较少用到的行为模式。原创 2023-08-23 11:18:56 · 95 阅读 · 0 评论 -
行为型(九) - 命令模式
请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。这里借鉴菜鸟教程的例子,一个经纪人处理股票买卖订单的过程。3、经纪人,可处理股票订单。1、股票抽象类及实现类。原创 2023-08-23 11:18:33 · 115 阅读 · 0 评论 -
行为型(八) - 备忘录模式
也叫快照(Snapshot)模式,在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。通俗点就是用于保存某个对象的状态,以便在适当的时候恢复对象。简单的应用比如:游戏存档、浏览器中的后退、word中的撤销。操作过程状态,该数据一旦创建不能留修改入口。原创 2023-08-23 11:18:07 · 87 阅读 · 0 评论 -
行为型(七) - 访问者模式
改变元素类的执行算法,来控制对数据结构的操作方式,也就是执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。总结:通过上面的例子,在梳理下概念,我们使用了一个访问者类,改变元素类的执行算法。这个访问类就是例子中的。:我们使用了一个访问者类,改变元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。:把业务操作跟具体的数据结构解耦。我们实现对不同文件的不同操作。原创 2023-08-23 11:17:43 · 95 阅读 · 0 评论 -
行为型(六) - 状态模式
判断当前状态,切换为下一个状态。为了避免过多状态及操作代码耦合,将各个状态都单独拆出来,在状态类中加入状态流转逻辑,把执行操作抽离到。总结:个人理解,使用场景就是包含有多种状态,且状态间可通过一些操作进行转换。正常硬代码实现,就是。: 一个对象的行为由它的状态决定,而且它必须在运行时根据自身状态改变它的行为。:类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。2、状态实现类,这里代码只贴了两个状态,其他都类似。原创 2023-08-23 11:17:06 · 70 阅读 · 0 评论 -
行为型(五) - 迭代器模式
总结:对于类似数组和链表这样的数据结构,遍历方式比较简单,在原来的类中实现也可以。如果将这部分遍历的逻辑写到容器类中,也会导致容器类代码的复杂性,所以统一将遍历操作拆分到迭代器类中。通俗的讲:迭代器模式就是提供一种遍历的方法,这种方法有两个特点:一是按你想要的方式访问到你想访问的元素,二是不暴露底层是什么存的。大部分编程语言都提供了遍历容器的迭代器类,我们在平时开发中,直接拿来用即可,几乎不大可能从零编写一个迭代器。:迭代器模式将集合对象的遍历操作从集合类中拆分出来,放到迭代器类中,让两者的职责更加单一。原创 2023-08-23 11:16:26 · 110 阅读 · 0 评论 -
行为型(四) - 责任链模式
将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。1、在上面代码的基础上加一个QuestionHandlerChain类来保存所有处理器。具体的实现方式有两种,用链表存储处理器和用数组存储处理器。原创 2023-08-22 09:37:36 · 66 阅读 · 0 评论 -
行为型(三) - 策略模式
策略模式和工厂模式结构很像。工厂模式是解耦对象的创建和使用,策略模式解耦的是策略的定义、创建、使用这三部分。这里以三国时期诸葛亮给刘备三个锦囊的故事为例子,锦囊相当于解决策略。:定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。原创 2023-08-22 09:37:06 · 64 阅读 · 0 评论 -
行为型(二) - 模板模式
模板方法模式在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤。这里举一个考试出试卷的例子,假设一个科目的试卷题型相对固定,选择、简答、论述,每次出题都是这几种类型。而这个科目每个月都要出一张试卷进行考试。1、模板接口,producePaper设计为final,避免子类重写。原创 2023-08-22 09:35:45 · 129 阅读 · 0 评论 -
行为型(一) - 观察者模式
在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。这里举个电视剧订阅的例子,比如琅琊榜,我们订阅以后,每集更新都会通知到所有的订阅者。原创 2023-08-22 09:35:03 · 77 阅读 · 0 评论 -
结构型(七) - 外观模式
现在年轻人比较喜欢智能家居,很多家电都可以用手机智能控制,比如:家里的灯可以语音或者手机软件上进行开关,智能窗帘、电视等都可以通过手机一键开启关闭。但是每次操作都需要一个一个进行,回家后对这些家电的操作方式基本一致,因此,我们定义一个“回家模式”外观类。:外观模式不符合“开闭模式”,当子系统类增加或者减少的时候,都需要修改外观类中的方法。:外观模式是迪米特法则的践行者,遵循着让客户端知道最少的原则,实现客户端和子系统类的解耦。2、外观模式 - 定义个“回家模式”,回家以后把灯打开,窗帘关上,电视打开。原创 2023-08-22 09:34:39 · 87 阅读 · 0 评论 -
结构型(六) - 组合模式
组合结构不常用,需要部分与整体的层次关系为树形结构,并且部分与整体的对象是能让客户端能统一对待、不需区分的对象,例如:文件管理系统,在遍历查找的时候,文件和文件夹对我们来说不做区分,可以做到逻辑统一。这里借鉴参考文章公司和职员的例子,公司的组织结构包含部门和员工两种数据类型。其中,部门又可以包含子部门和员工。然后通过构建树形结构来遍历计算公司总的工资支出成本。:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。1、定义公司及员工的父类。原创 2023-08-22 09:34:12 · 95 阅读 · 0 评论 -
结构型(五) - 适配器模式
正常插排提供的电压是220V,但是我们的电子设备可能只需要5V电压,所以厂商会提供一个充电器,这个充电器就是适配的作用。如果接口不多,我个人觉得对象适配器更好些,因为在调用的时候会把被适配器类传递进去,这样看代码的时候就能知道是对哪个类进行了适配,以后修改的时候也会注意。:这个模式就是用来做适配的,它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。:适配器模式是一种事后的补救策略,我们在设计初期,就应该尽量规避掉接口不兼容的问题。的接口,比起对象适配器的实现方式,原创 2023-08-22 09:33:52 · 85 阅读 · 0 评论 -
结构型(四) - 装饰器模式
系统中有一个通知功能,通知分为紧急、重要、一般等几个等级,以前发通知就发一段文字。5、加入图片和动画的装饰类,首先实现一个NotificationDecorator类,来统一实现setNotice、getNotice等方法,这样后面子类直接调用就行。8、调用实现,在原来文字通知的基础上加上一个图片,后面是叠加一个动画装饰器,既显示文字又显示图片还是显示动画,即装饰器可相互嵌套,为原始功能增加多个功能。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。原创 2023-08-22 09:33:13 · 76 阅读 · 0 评论 -
结构型(三) - 享元模式
所有玩家都可以选择这个武器,由于这个武器一旦上线一般不会改动,它内部的杀伤力等配置都是固定的,所以没必要为每一个玩家新建一个武器对象,这个武器就可以设置为全局唯一享元对象。但是,对于字符串来说,我们没法事先知道要共享哪些字符串常量,所以没办法事先创建好,只能在某个字符串常量第一次被用到的时候,存储到常量池中,当之后再用到的时候,直接引用常量池中已经存在的即可,就不需要再重新创建了。:我们在需要创建大量(例如10^5)的相似的对象时,使用享元模式,把不可变的对象单独抽出来,进行共享可以减少内存消耗。原创 2023-08-22 09:32:39 · 110 阅读 · 0 评论 -
结构型(二) - 桥接模式
这里用手机和处理器的关系来举个例子,手机牌子有:华为、小米、OPPO等,处理器有:麒麟、骁龙、天玑等。两者的变化维度是相对独立的,各自进行演进,但是不同的手机品牌和不同的处理器可以组合形成不同的产品。因此,我们用桥接的方式把他们连接起来。另一种理解方式:一个类存在两个(或多个)独立变化的维度,我们通过组合的方式,让这两个(或多个)维度可以独立进行扩展。:是用于把抽象化与实现化解耦,使得二者可以独立变化。它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。1、处理器接口及实现。原创 2023-08-21 10:00:44 · 443 阅读 · 0 评论 -
结构型(一) - 代理模式
6、如果我们要访问国外的网站Youtube,Facebook等,直接访问是不行的,我们就需要加一个vpn,登录vpn后可正常访问。总结:个人理解,vpn这里相当于一个网站代理,我们把要访问的网站给代理类,代理类会处理vpn登录等判断并帮我们访问我们需要的网站。:代理模式最常用的一个应用场景就是,在业务系统中开发一些非功能性需求,比如:监控、统计、鉴权、限流、事务、幂等、日志。动态代理就是我们不事先为每个原始类编写代理类,而是在运行的时候,动态地创建原始类对应的代理类,然后在系统中用代理类替换掉原始类。原创 2023-08-21 09:59:13 · 467 阅读 · 0 评论 -
创建型(四) - 原型模式
浅拷贝:就是复制了一份肯德基套餐A,但是里面包含的可乐和汉堡还是原来的那一份,如果咬一口汉堡,那么原来的那个就缺一块。总结:从结果看到,说明克隆后的对象和原始的指向的是同一个cola对象,改名字后都变了,但是基本类型数据是没有改变的。总结:这个方式就是把克隆对象中引用的对象也进行浅克隆,但是如果出现嵌套多层的时候,每个引用对象都得实现克隆,太麻烦。深拷贝:也是复制了一份肯德基套餐A,但是里面的可乐和汉堡是新的对象,如果咬一口汉堡,那么原来的那个还是完好无损的。原型模式有两种实现方法,深拷贝和浅拷贝。原创 2023-08-21 09:57:22 · 774 阅读 · 0 评论 -
创建型(三) - 建造者模式
代码是创建一杯奶茶,奶茶名字是必须的,不然不知道做什么,然后两个可选字段,是否加珍珠和椰果。后面的例子就会报错,因为没有设置名称,就和你去奶茶店给人家说:要一杯奶茶,加珍珠和椰果。:也叫构建者模式,或生成器模式,指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。:当构造器的参数过多,而且这些参数有些是可选的参数,参数间有相互依赖关系等需求时,可以考虑使用建造者模式。建造者模式是用来创建同一种类型的复杂对象,通过设置不同的可选参数,“定制化”地创建不同的对象。原创 2023-08-21 09:54:59 · 462 阅读 · 1 评论 -
创建型(二) - 单例模式
指令重排问题:当线程A执行到9行的时候,线程B执行到6行,CPU在进行对象创建的时候,内部会在保证不影响最终结果的前提下对指令进行重新排序(不影响最终结果只是针对单线程)。总结:在类加载的时候就对实例进行初始化,没有线程安全问题;总结:上面是线程安全的懒汉模式,在第一次使用的时候才进行初始化,达到了懒加载的效果;此时线程B执行到第6行,发现mInstance不为空,但是对象并没有初始化完成,会出现问题,但是概率较低。:在内存里只有一个实例,减少了内存的开销,避免一个全局使用的类频繁地创建与销毁。原创 2023-08-21 09:53:07 · 558 阅读 · 0 评论 -
创建型(一) - 简单工厂模式、工厂方法模式和抽象工厂模式
本文使用了王争老师设计模式课程中的例子,写的很清晰,而且中间穿插了代码优化。由于设计模式就是解决问题的一种思路,所以每个设计模式会从问题出发,这样比较好理解设计模式出现的意义。原创 2023-08-21 09:49:45 · 1248 阅读 · 0 评论 -
设计模式原则及分类
此时如果上层直接依赖底层实体工具,以后新添加一个出行工具就要动上层依赖方代码,此时我们可以给所有下层的交通工具抽象出一个接口vehicl,上层依赖vehicl接口,这样底层代码扩展不会影响上层代码功能。为了使程序的扩展性好,易于维护和升级,在扩展的时候,尽量不要修改原代码,而是要了扩展原代码,比如接口实现。策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。原创 2023-08-21 09:44:54 · 301 阅读 · 0 评论