![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式笔记
秃头佛爷
日积月累,慢慢行慢慢积,文章属个人笔记,有错误之处,还望指正
展开
-
Java23种设计模式-行为型模式之访问者模式
(ObjectStructure):一个包含元素集合的类,它可以是集合对象,也可以是图中的节点集合,它提供了一个方法用来遍历元素集合,并且允许访问者访问它的元素。(Visitor):定义了一个访问元素的接口,为每个需要被访问的元素类都提供一个访问方法,即在Visitor中定义了一组方法,每个方法对应一个具体元素类。(Element):定义了一个接受访问者的接口,即一个accept方法,它接受一个访问者对象作为参数。1.使得元素类与访问者类耦合在一起,因为元素类需要知道访问者类的存在。原创 2024-04-27 16:22:50 · 688 阅读 · 0 评论 -
Java23种设计模式-行为型模式之责任链模式
定义了一个请求类(Request),然后定义了一个处理者接口(Handler),接着实现了具体的处理者类(ConcreteHandler),最后创建了一个客户端(Client)来测试责任链模式。(Handler):定义一个接口,其中包含一个方法用于处理请求(如 handleRequest()),并一个方法用于设置下一个处理者(如 setNext())。2.可以动态地添加或删除责任链中的处理者,或者改变处理者的顺序,而不影响其他处理者。1.当一个请求存在多个可能的处理者,且每个处理者都有可能处理该请求时。原创 2024-04-27 14:05:56 · 391 阅读 · 1 评论 -
Java23种设计模式-行为型模式之状态模式
(ConcreteState):实现State接口,并且它包含了与Context的当前状态相关的行为。(State):定义一个接口以封装与Context的一个特定状态相关的行为。1.随着状态的增多,系统中类的数量可能会增加,这可能会增加系统的复杂性。2.使得状态转换逻辑与状态对象相分离,这可以使得状态转换逻辑更加清晰。1.将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。2.使用的时候需要考虑到状态的转移,可能会引起状态转移的复杂性。,并且它的状态是可变的时候。原创 2024-04-27 13:44:39 · 921 阅读 · 0 评论 -
Java23种设计模式-行为型模式之解释器模式
定义了抽象表达式Expression、终结符表达式NumberExpression、非终结符表达式AddExpression以及上下文Context。(Non-terminal Expression):实现抽象表达式中的interpret()方法,表示语言中的非终结符。(Terminal Expression):实现抽象表达式中的interpret()方法,表示语言中的终结符。可以将复杂的问题分解成一系列简单的表达式,然后使用解释器来解释这些表达式。(Context):包含解释器解释的信息的类。原创 2024-04-26 17:58:55 · 418 阅读 · 0 评论 -
Java23种设计模式-行为型模式之备忘录模式
通过这些类的协作,我们可以保存和恢复对象的状态。在测试类中,我们创建了一个发起人对象和一个管理者对象,并对其进行状态的保存和恢复操作,最终输出了保存和恢复后的状态。:在游戏开发中,可以使用备忘录模式来保存游戏的进度,允许玩家在特定检查点保存游戏状态,并在需要时加载之前保存的状态。(Originator):负责创建一个备忘录对象,用于记录当前的内部状态,并可以使用备忘录对象来恢复内部状态。:在需要保存系统或应用程序的当前状态,以便在发生故障时可以恢复到该状态的场景中,可以使用备忘录模式。原创 2024-04-26 17:19:07 · 622 阅读 · 1 评论 -
Java23种设计模式-行为型模式之中介者模式
(ConcreteColleague):每一个具体同事类都实现了在同事类中定义的接口,并且它们都持有一个中介者对象的引用。(Colleague):定义了中介者模式中各个对象的接口,这些对象不直接交互,而是通过中介者对象来进行。(ConcreteMediator):实现了中介者接口,通过具体同事类的对象来改进各同事之间的交互。当对象之间的交互变得非常复杂时,使用中介者模式可以简化对象之间的交互。减少了对象之间的依赖,每个对象不需要知道其他对象的实现细节。当系统中对象很多时,中介者对象可能会变得非常复杂。原创 2024-04-26 09:59:13 · 445 阅读 · 1 评论 -
Java23种设计模式-行为型模式之观察者模式
(Subject):也称为被观察者或可观察者,它是具有状态的对象,并维护着一个观察者列表。如果一个被观察者对象知道所有的观察者对象,可能会导致循环依赖,这样会增加系统的复杂性。当一个对象的改变需要同时改变其他对象时,而其他的这些对象不依赖于主题对象的具体类型时。(Concrete Observer):具体观察者是观察者的具体实现类。,例如当一个对象更改状态时,所有依赖于它的对象都会收到通知并自动更新。观察者需要实现一个更新方法,当收到主题的通知时,当观察者对象很多时,通知的分发可能会造成性能瓶颈。原创 2024-04-26 09:39:53 · 289 阅读 · 0 评论 -
Java23种设计模式-行为型模式之迭代器模式
然后在主程序中,我们通过调用createIterator()方法获取迭代器,并通过迭代器的hasNext()和next()方法遍历集合中的元素。(Iterator):定义了迭代器对象需要实现的方法,如next()(移动到下一个元素)、hasNext()(检查是否有下一个元素)、remove()(删除当前元素)等。(Aggregate):定义了创建迭代器对象的方法,通常是一个名为createIterator()的方法。不暴露聚合对象的内部结构,提供了一个安全的方式来访问聚合对象。迭代器模式定义了一种顺序。原创 2024-04-26 09:13:17 · 432 阅读 · 2 评论 -
Java23种设计模式-行为型模式之命令模式
简单的遥控器程序,用户可以通过遥控器来控制电视的开关:Command 是命令接口,ConcreteCommand 是具体命令类,它持有一个 Receiver 对象,负责将调用者请求的操作委托给 Receiver。ConcreteCommand(具体命令类):实现了Command接口,它对应于具体的行为和接收者的绑定。命令模式也支持可撤销的操作。当需要将操作请求与操作实现分离,从而使得可以在不同的时间或不同的环境中执行请求时。Client(客户端):创建具体的命令对象,并指定相应的接收者。原创 2024-04-25 10:37:44 · 415 阅读 · 0 评论 -
Java23种设计模式-行为型模式之模板方法模式
Beverage 是抽象类,定义了制作饮料的模板方法和一些基本方法。):定义了模板方法和一些基本的方法。模板方法是一个定义算法骨架的方法,它调用基本方法来完成算法的各个步骤。):在抽象类中定义,可以被子类重写。钩子方法允许子类在模板方法的执行过程中进行干预。当需要在一个算法中定义一系列步骤,但某些步骤可以延迟到子类中实现时。):继承自抽象类,实现模板方法中尚未实现的基本方法。当需要复用代码,但不希望子类依赖于特定的实现时。,将一些步骤延迟到子类中实现。每一个不同的实现都需要一个子类,这可能会导致。原创 2024-04-25 09:37:44 · 378 阅读 · 0 评论 -
Java23种设计模式-行为型模式之策略模式
FlyStrategy 是策略接口,FlyWithWings 和 FlyNoWay 是具体策略类,Duck 是上下文类,客户端通过创建不同策略的 Duck 对象来模拟不同鸭子的飞行行为。(Concrete Strategy):实现则实现了这些协议,并为特定的算法提供具体的实现。(Context):持有策略接口的引用,并在运行时根据需要更换具体的策略实现。当算法可能发生变化,且变化不应影响到使用算法的客户端时。1.客户端必须知道所有的策略类,至少是它们的接口。当这些算法相互之间是等价的,且可以互换时。原创 2024-04-25 09:16:05 · 600 阅读 · 0 评论 -
Java23种设计模式-结构型模式之享元模式
(Flyweight Factory):管理享元对象池,确保合理地共享享元对象。(Client):客户端使用享元工厂来获取享元对象,并与外部状态一起使用。1.节省内存:通过共享已存在的对象,减少对象的创建数量,节省内存资源。8.性能权衡:在某些情况下,可能会因为享元的共享而导致一定的性能损失。1.复杂性增加:需要额外的代码来管理享元对象,增加了系统的复杂性。4.代码可读性降低:复杂的享元模式实现可能会降低代码的可读性。2.状态管理复杂:对象的状态可能会变得复杂,需要仔细处理。原创 2024-04-24 17:54:55 · 373 阅读 · 0 评论 -
Java23种设计模式-结构型模式之外观模式
ComputerFacade类作为外观类,它封装了对CPU、Memory和HardDrive类的操作,客户端只需要与ComputerFacade类交互,从而简化了客户端Demo的代码。(Facade Pattern):为复杂的系统提供了一个简单的统一接口,使得系统更易于使用和理解((Facade):外观类提供了一个简化的接口,封装了系统的复杂性。:隐藏了系统的复杂细节,提供了一个简单的、高层的接口。:过于复杂的外观类可能会降低代码的可读性。:外观类的设计可能会限制系统的灵活性。:便于系统的维护和扩展。原创 2024-04-24 17:26:18 · 737 阅读 · 0 评论 -
Java23种设计模式-结构型模式之组合模式
Composite 是组合对象,它也实现了 Component 接口,并管理一组子组件。”层次结构,同时保持对单个对象和组合对象的一致性操作,主要目的是简化客户端代码,因为它可以统一处理单个对象和组合对象。:组合模式的设计相对复杂,需要考虑对象的层次结构和组合关系。:由于组合模式的实现方式较为固定,可能会限制一些特殊的需求。(Client):通过抽象组件接口来操作叶子对象和组合对象。,并将叶子对象添加到组合对象中。:封装了组件的内部结构,提高了安全性。:可以一致地处理单个对象和组合对象。原创 2024-04-24 16:31:04 · 356 阅读 · 0 评论 -
Java23种设计模式-结构型模式之桥接模式
ImplementationA 和 ImplementationB 是实现部分,它们分别实现了 Abstraction 的 performOperation 方法。Demo可以通过 Abstraction 接口来调用不同的实现对象,从而实现了抽象与实现的解耦。通过使用桥接模式,可以提高系统的灵活性、可扩展性和可维护性,使系统更易于扩展和修改。:可以将图形的表现形式和绘制方式分离,以便更灵活地扩展和组合。:例如,将游戏角色的行为和具体的动画效果分离。:将设备的通用功能和特定硬件的实现分开。原创 2024-04-24 15:21:50 · 604 阅读 · 0 评论 -
Java23种设计模式-结构型模式之装饰器模式
接着,我们定义了一个Decorator抽象类,它同样实现了Component接口,并持有一个Component类型的成员变量。之后,我们创建了两个具体的装饰器ConcreteDecoratorA和ConcreteDecoratorB,它们都继承自Decorator类,并且各自添加了不同的行为。:当需要在不修改现有代码的基础上,为对象添加新的功能或行为时。:可以将多个装饰器组合在一起,以构建复杂的功能。:不同的装饰器可以独立进行扩展和修改,互不影响。:通过添加装饰器来优化对象的性能。,更易于测试和维护。原创 2024-04-24 14:59:39 · 518 阅读 · 0 评论 -
Java23种设计模式-结构型模式之适配器模式
创建一个MediaPlayer接口和一个实现了这个接口的AudioPlayer类,以及一个适配器类MediaAdapter,它将用于将不同格式的音频文件转换为MediaPlayer接口所需的格式。:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。了现存的类,程序员不需要修改原有代码而重用现有的适配者类。:当前系统业务所期待的接口,可以是抽象类或接口。:它是被访问和适配的现存组件库中的组件接口。,解决了目标类和适配者类接口不一致的问题。原创 2024-04-24 11:02:52 · 1012 阅读 · 0 评论 -
Java23种设计模式-结构型模式之代理模式
在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。(2)代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和。是由程序员创建或工具生成代理类的源码,再编译代理类。就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。:真实的角色就是实现实际的业务逻辑,真实角色实现的业务方法。原创 2024-04-24 09:42:49 · 182 阅读 · 0 评论 -
Java23种设计模式-创建型模式之原型模式
设置一个原型类MyObject 然后创建深拷贝类MyObjectDeepClone 和浅拷贝类MyObjectShallowClone 最后创建一个测试类Client 然后修改数据 打印查看即可知浅拷贝和深拷贝区别。工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建,即。2.通过new产生一个对象需要非常繁琐的数据准备或访问权限。1.类初始化需要消化非常多的资源,包括数据、硬件资源。可以克隆预生成原型,:创建一个新对象,新对象的属性和原来。原创 2024-04-23 17:44:49 · 423 阅读 · 0 评论 -
Java23种设计模式-创建型模式之单例模式
基于 classloader 机制避免了多线程的同步问题,不过,instance 在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用 getInstance 方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化 instance 显然没有达到 lazy loading 的效果。,不需要共享给所有线程,也不需要加synchronize之类的锁,以提高性能。:作为创建类的全局属性存在,创建类被装载时创建。之类保证线程安全的基础上的懒汉模式,原创 2024-04-23 10:01:27 · 678 阅读 · 0 评论 -
设计模式-六大原则
只暴露给调用的类它需要的方法,不需要的方法则隐藏起来。这有助于减少类对接口的依赖,提高系统的灵活性和可重用性。,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。设计模式的六大原则是软件工程中的基本概念,使得构建可维护、可扩展和可重用的代码。一个类或方法应该只有一个引起变化的原因,确保类或模块的功能高度内聚。里氏替换原则:子类可以扩展父类的功能,但不能改变父类原有的功能。4.当子类的方法实现父类的抽象方法时,方法的。3.当子类的方法重载父类的方法时,方法的。原创 2024-04-20 15:40:04 · 508 阅读 · 0 评论 -
Java23种设计模式-创建型模式之工厂方法模式
它是工厂方法模式的核心,与应用程序无关,系统的灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。如果抽象产品只能生产一种产品,这可能成为一个限制。ShapeFactory,它可以根据参数。一种创建型设计模式,它定义了一个用于。(Product)。了抽象产品角色所定义的接口的。,由专门的具体工厂来创建。和实现了Shape接口的。不关心创建产品的细节。原创 2024-04-22 10:46:36 · 468 阅读 · 0 评论 -
设计模式-创建型模式之简单工厂模式
工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的。它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是。原创 2024-04-22 11:20:13 · 218 阅读 · 0 评论 -
Java23种设计模式-创建型模式之建造者模式
示例:定义了一个Computer产品类,一个Builder接口,以及一个具体的LaptopBuilder类实现Builder接口。客户端代码中,我们创建了Director、Builder和Computer的实例,并通过Director来构建一台电脑。不同的具体建造者可以实现不同的构建步骤,从而创建不同的产品变体,提高了系统的扩展性。,每个具体建造者负责构建特定的产品变体。,建造者模式的目标是构建这个产品。将一个复杂对象的构建与它的表示。中,提高了代码的封装性。了抽象建造者定义的方法,,便于控制细节风险。原创 2024-04-22 17:34:07 · 373 阅读 · 0 评论 -
Java23种设计模式-创建型模式之抽象工厂模式
ConcreteFactory,它负责创建产品对象。最后,在客户端代码中,我们通过。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是。ProductA和ProductB,以及它们的。规定了所有可能被创建的产品集合,产品族中。:担任这个角色的是工厂方法模式的。增加了系统的抽象性和理解难度。,需要修改抽象工厂的接口。的任何产品对象都是某一个。:担任这个角色的类是。,无须关心创建细节。Factory和一个。原创 2024-04-22 11:45:03 · 323 阅读 · 0 评论