![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式
文章平均质量分 87
smart哥
一名有10余年经验的互联网老兵,历经从传统软件公司到大型互联网公司的洗礼,早年在中兴通讯等大型通信公司担任项目leader,后随着互联网的崛起,先后在前美团支付等大型互联网公司担任架构师。对互联网架构底层技术有相当的研究和独特的见解,在多个领域有着丰富的实战经验。
展开
-
设计模式之观察者模式
设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。( 引用维基百科 )观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。原创 2024-02-05 09:57:21 · 1067 阅读 · 0 评论 -
设计模式之迭代器模式
迭代器模式也叫游标模式。用来遍历集合对象(如数组、链表、树、图、跳表)。迭代器模式将集合对象的遍历操作从集合类中拆分出来,让两者的职责更加单一。迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示。/*** 判断是否有下一个元素* @return*//*** 迭代器内部指针+1动作*//*** 返回当前元素* @return*/@Override@Overridecursor++;原创 2024-02-05 09:54:38 · 510 阅读 · 0 评论 -
设计模式之命令模式
命令模式将请求封装成对象,以便使用不同的请求、队列或日志来参数化其他对象。命令模式也支持可撤销的操作。一个命令对象通过在特定接收者上绑定一组动作来封装一个请求。要达到这一点,命令对象将动作和接收者包进对象。这个对象只暴露出一个execute()方法,当此方法被调用的时候,接收者就会进行这些动作。从外面看,其他对象不知道空间哪个接收者进行了哪些动作,只知道如果调用了execute()方法,请求的目的就能达到。/*** 命令定义*//*** 执行命令*//*** 回退命令*//**原创 2024-02-05 09:52:15 · 762 阅读 · 0 评论 -
设计模式之解释器模式
解释器模式为某个语言定义它的语法(或者叫文法)表示,并定义一个解释器用来处理这个语法。/*** 定义表达式解析模板*//*** 对状态进行判断* @return*//*** 解析 &&* AND的话,需要里面的每个表达式都要满足最后才输出true*/} else {@Overrideif (!解释器模式为某个语言定义它的语法(或者叫文法)表示,并定义一个解释器用来处理这个语法。解释器模式的代码实现比较灵活,没有固定的模板。原创 2024-02-05 09:50:09 · 317 阅读 · 0 评论 -
设计模式之备忘录模式
在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。这个模式的定义主要表达了两部分内容。一部分是,存储副本以便后期恢复。这一部分很好理解。另一部分是,要在不违背封装原则的前提下,进行对象的备份和恢复。模式建议将对象状态的副本存储在一个名为备忘录(Memento) 的特殊对象中。除了创建备忘录的对象外, 任何对象都不能访问备忘录的内容。原创 2024-02-04 10:47:12 · 928 阅读 · 0 评论 -
设计模式之模板方法
模板方法模式在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤。(引用GoF 设计模式)模板方法模型是一种行为设计模型。模板方法是一个定义在父类别的方法,在模板方法中会呼叫多个定义在父类别的其他方法,而这些方法有可能只是抽象方法并没有实作,模板方法仅决定这些抽象方法的执行顺序,这些抽象方法的实作由子类别负责,并且子类别不允许覆写模板方法。(引用维基百科)/*** 抽象类: 作为基类,其子类必须实现抽象方法*/原创 2024-02-04 10:44:27 · 543 阅读 · 0 评论 -
设计模式之访问者模式
允许一个或者多个操作应用到一组对象上,解耦操作和对象本身。/*** 访问者接口* 包含两个重载函数,分别处理两种不同类型的资源文件。具体选择哪个文件处理,需要在编译时进行绑定,* 在各个Resource实现内部,会把this传递给当前方法,这样就可以知道绑定的对象是哪个,选用合适的重载方法进行处理。* 具体做什么业务处理,由实现这个visitor接口的具体实现类来决定。*//*** 定义PDF类型*//*** 定义Word类型*//*** 定义压缩功能访问者实现类*/原创 2024-02-04 09:51:21 · 883 阅读 · 0 评论 -
设计模式之职责链模式
将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。多个处理器依次处理同一个请求。一个请求先经过A处理器处理,然后再把请求传递给B处理器,B处理完后传递给C,以此类推,形成一个链条。链条上的每个处理器各自承担各自的处理职责。职责链模式实现有多种。/*** 敏感词过滤一*/@Overrideif (content.content.contains("性")) {/*** 敏感词过滤二*/原创 2024-02-04 09:48:42 · 791 阅读 · 0 评论 -
设计模式之策略模式
可以实现目标的方案集合。根据形势发展而制定的行动方针和斗争方法。有斗争艺术,能注意方式方法。“策略”就是为了实现某一个目标,首先预先根据可能出现的问题制定的若干对应的方案,并且,在实现目标的过程中,根据形势的发展和变化来制定出新的方案,或者根据形势的发展和变化来选择相应的方案,最终实现目标。(引用百度百科)策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。原创 2024-02-04 09:41:43 · 1011 阅读 · 0 评论 -
设计模式之状态模式
状态存储关于过去的信息,就是说:它反映从系统开始到现在时刻的输入变化。转移指示状态变更,并且用必须满足确使转移发生的条件来描述它。动作是在给定时刻要进行的活动的描述。进入动作(entry action):在进入状态时进行退出动作(exit action):在退出状态时进行输入动作:依赖于当前状态和输入条件进行转移动作:在进行特定转移时进行FSM(有限状态机)可以使用上面图1那样的状态图(或状态转移图)来表示。此外可以使用多种类型的状态转移表。原创 2024-02-04 09:32:00 · 674 阅读 · 0 评论 -
设计模式之享元模式
所谓享元,顾名思义就是被共享的单元。享元模式的意图是复用对象,节省内存,前提是享元对象是不可变对象。在内存中只保留一份实例,供多处代码引用。/*** 享元类* 这里定义的字段都是可以复用的*/RED, BLACK;static {pieces.put(1, new ChessPieceUnit(1, "車", ChessPieceUnit.Color.BLACK));原创 2024-02-04 09:28:59 · 424 阅读 · 0 评论 -
设计模式之门面模式(外观模式)
将一个或数个类的复杂的一切都隐藏在背后,只显露一个干净美好的门面(外观)。门面没有封装子系统的类,门面只提供简化的接口。所以客户觉得有必要,依然可以直接使用子系统的类。创建一个接口简化而统一的类,用来包装子系统中的一个或多个复杂的类。门面模式为子系统提供了一组统一的接口,定义一组高层接口让子系统更易用。解决易用性问题。外观模式可以用来封装系统的底层实现,隐藏系统的复杂性,提供一组更加简单易用、更高层的接口。如Linux是对内核的封装。Shell命令是对Linux操作系统的封装。解决性能问题。原创 2024-02-04 09:23:50 · 414 阅读 · 0 评论 -
设计模式之组合模式
将一组对象组织(Compose)成树形结构,以表示一种“部分 - 整体”的层次结构。组合让客户端(在很多设计模式书籍中,“客户端”代指代码的使用者。)可以统一单个对象和组合对象的处理逻辑。组合模式允许你将对象组合成树形结构来表现整体/部分层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。组合模式是一种结构型设计模式, 你可以使用它将对象组合成树状结构, 并且能像使用独立对象一样使用它们。组合模式的设计思路,与其说是一种设计模式,倒不如说是对业务场景的一种数据结构和算法的抽象。原创 2024-02-03 20:29:55 · 620 阅读 · 0 评论 -
设计模式之装饰者模式
装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。(引用 Head First 设计模式)一种动态地往一个类中添加新的行为的设计模式。就功能而言,修饰模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些功能。通过使用修饰模式,可以在运行时扩充一个类的功能。原理是:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数。装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法。原创 2024-02-03 20:28:10 · 1124 阅读 · 0 评论 -
设计模式之桥接模式
桥接模式是一种结构型设计模式, 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构, 从而能在开发时分别使用。将抽象和实现解耦,让它们可以独立变化。一个类存在两个(或多个)独立变化的维度,我们通过组合的方式,让这两个(或多个)维度可以独立进行扩展。JDBC是桥接模式典型应用。如果你想要拆分或重组一个具有多重功能的庞杂类(例如能与多个数据库服务器进行交互的类),可以使用桥接模式。类的代码行数越多, 弄清其运作方式就越困难, 对其进行修改所花费的时间就越长。原创 2024-02-03 20:24:39 · 824 阅读 · 0 评论 -
设计模式之适配器模式
在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。适配器模式主要应用于,当接口里定义的方法无法满足客户的需求,或者说接口里定义的方法的名称或者方法界面与客户需求有冲突的情况。(引用百度百科)适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。原创 2024-02-03 14:46:22 · 977 阅读 · 0 评论 -
设计模式之代理模式
代理模式为另一个对象提供一个替身或占位符以控制对这个对象访问。代理模式(英语:Proxy Pattern)是程序设计中的一种设计模式。所谓的代理者是指一个类别可以作为其它东西的接口。代理者可以作任何东西的接口:网络连接、存储器中的大对象、文件或其它昂贵或无法复制的资源。著名的代理模式例子为引用计数(英语:reference counting)指针对象。当一个复杂对象的多份副本须存在时,代理模式可以结合享元模式以减少存储器用量。典型作法是创建一个复杂对象及多个代理者,每个代理者会引用到原本的复杂对象。原创 2024-02-03 12:43:51 · 683 阅读 · 0 评论 -
设计模式之工厂模式(工厂方法模式、抽象工厂模式)
工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。工厂方法模式帮助我们将产品的实现从使用中解耦。如果增加产品或者改变产品的实现。Creator类并不会受影响。/*** PizzaStore 作为超类,可以被其他* 各个加盟店之间的区别在于风味不同,而其它流程我们认为是相同的*//*** ① 工厂方法是抽象的。所以依赖子类来处理对象的创建* ② 必须返回一个产品。原创 2024-02-03 12:40:53 · 1245 阅读 · 0 评论 -
设计模式之责任链模式
将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。多个处理器依次处理同一个请求。一个请求先经过A处理器处理,然后再把请求传递给B处理器,B处理完后传递给C,以此类推,形成一个链条。链条上的每个处理器各自承担各自的处理职责。职责链模式实现有多种。/*** 敏感词过滤一*/@Overrideif (content.content.contains("性")) {/*** 敏感词过滤二*/原创 2024-02-03 12:28:31 · 527 阅读 · 0 评论 -
设计模式之单例模式
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!原创 2024-02-03 12:24:49 · 965 阅读 · 0 评论 -
设计模式之原型模式
如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式来创建新对象,以达到节省创建时间的目的。这种基于原型来创建对象的方式就叫作原型设计模式(Prototype Design Pattern),简称原型模式。浅拷贝和深拷贝的区别在于:浅拷贝只会复制的索引,不会复制数据本身。相反,深拷贝不仅会复制索引,还会复制数据本身。浅拷贝得到的对象和原始对象共享数据,而深拷贝得到的是一份独立的对象。原创 2024-02-03 12:00:41 · 422 阅读 · 0 评论