设计模式
文章平均质量分 52
沉墨的夜
淑女靠修养,少女靠打扮,女人靠气质,而我靠内涵
展开
-
设计模式二十二-策略模式
我们可以定义一个 PaymentStrategy 接口,并为每种付款方式实现一个具体的策略类,然后在运行时动态地切换不同的策略。当一组算法中的每个算法都具有不同的变体时,可以使用策略模式。我们可以定义一个 SortStrategy 接口,并为每个算法实现一个具体的策略类,然后在运行时动态地选择不同的算法实现。为了使算法可以互换使用,策略模式要求所有算法实现都实现同一个接口,并且具有相同的方法签名。这样,我们就可以在运行时选择使用不同的算法来排序数字,而不需要在代码中硬编码算法。原创 2023-02-27 22:41:36 · 116 阅读 · 0 评论 -
设计模式二十四-访问者模式
在访问者模式中,我们可以根据需要定义多个访问者类和多个元素类,从而实现不同的算法和数据结构组合。访问者类中定义了一组 visit() 方法,这些方法用于执行特定的操作,而元素类中则提供了一个 accept() 方法,这个方法用于接受访问者并调用它的 visit() 方法。当我们需要对一个对象结构中的元素进行多种不同的操作,并且这些操作的组合方式可能不同,同样可以使用访问者模式。当我们需要对一个对象结构中的元素进行复杂的操作,而且这些操作的具体实现可能不同,也可以使用访问者模式。原创 2023-02-27 22:43:14 · 71 阅读 · 0 评论 -
设计模式二十三-模板方法模式
在 crawl() 方法中,我们调用了 beforeCrawl() 和 afterCrawl() 方法,这些方法是 WebCrawler 中的具体方法,它们用于执行一些特定的。总之,模板方法模式是一种非常有用的设计模式,它可以帮助我们实现具有固定算法骨架的算法,并让子类实现算法中的某些特定步骤。在模板方法模式中,抽象类中定义了一个模板方法,这个方法给出了算法的基本步骤,而具体的实现则交由子类来完成。当我们需要让子类实现算法中的某些特定步骤,但又希望确保算法的结构保持不变时,可以使用模板方法模式。原创 2023-02-27 22:28:56 · 74 阅读 · 0 评论 -
设计模式二十一-状态模式
在上面的示例中,State接口定义了状态的行为,NormalState和FireState是具体的状态类。Context(上下文)类持有一个状态类的实例,它的行为会根据当前状态对象的变化而变化。当状态发生改变时,Context会将当前状态的控制权委托给新的状态类,从而达到状态转换的目的。在状态模式中,对象的类将其状态封装成一个独立的对象,从而使其可以在运行时改变状态,并且可以根据不同的状态调用不同的行为。应用场景: 状态模式常常用于需要根据对象状态来改变其行为的场景,如:状态机、游戏中角色的状态转换等。原创 2023-02-27 21:06:38 · 59 阅读 · 0 评论 -
设计模式二十-观察者模式
装饰者模式通过将对象包装在装饰器类中,以达到动态地给对象添加新功能的目的。装饰器类继承自被装饰的对象的父类或实现同一接口,并在构造方法中接受被装饰对象,通过组合的方式将被装饰对象嵌入到装饰器类中。可以看到,文本编辑器被装饰了两次,分别添加了“加粗”和“加下划线”两个功能。设计模式中的装饰者模式是一种结构型模式,它可以在不改变对象自身的基础上,动态地给对象增加功能。假设我们需要给一个文本编辑器增加“加粗”和“加下划线”两个功能,可以通过装饰器模式来实现。需要对一组独立的、不相同的对象进行操作或者处理。原创 2023-02-26 12:17:25 · 72 阅读 · 0 评论 -
设计模式十九-备忘录模式
备忘录模式的核心原理是将对象的内部状态封装在备忘录对象中,并在需要时恢复对象的状态。Originator是需要被保存和恢复状态的对象,Memento是保存状态的对象,而Caretaker是负责保存备忘录对象和恢复状态的对象。在游戏中,每当玩家进行一次操作或达到一个新的游戏状态时,可以创建一个备忘录对象,并将其保存在游戏的备忘录列表中。在编辑器中,每当进行一次操作,可以创建一个备忘录对象,并将其保存在撤销栈中。通过将当前状态保存到备忘录中,并将备忘录存储到备忘录栈中,我们就可以在需要的时候恢复到之前的状态。原创 2023-02-26 12:10:20 · 181 阅读 · 0 评论 -
设计模式十八-中介者模式
在上面的代码中,我们创建了一个中介者对象ChatMediatorImpl,并将三个用户添加到了中介者对象中。当用户1向中介者发送一条消息时,中介者会将该消息发送给用户2和用户3。中介者模式的核心是中介者对象,它可以处理对象之间的通信。当一个对象想要与另一个对象通信时,它将请求发送给中介者对象,而不是直接发送给其他对象。中介者模式通过将对象之间的通信集中到中介者对象中,来实现对象之间的松散耦合。当一个用户向中介者发送一条消息时,中介者会遍历用户列表,并将消息发送给除发送者之外的所有用户。原创 2023-02-26 08:32:52 · 119 阅读 · 0 评论 -
设计模式十七-迭代器模式
在上面的代码中,MyList类实现了Iterable接口,并返回一个迭代器对象MyListIteratorImpl,该对象实现了MyListIterator接口的方法。在Java中,迭代器接口是java.util.Iterator,它定义了在聚合对象上执行迭代的方法,例如next()和hasNext()。Java集合框架中的所有集合类都实现了该接口,并提供了一种通用的方法来遍历它们的元素。迭代器模式的核心是迭代器接口,它定义了在聚合对象上执行迭代的方法。聚合对象实现了该接口,以便可以返回一个迭代器对象。原创 2023-02-25 21:44:08 · 150 阅读 · 0 评论 -
设计模式十六-解释器模式
接下来,我们使用解析器对象解析表达式并生成一个抽象语法树。它的原理是使用抽象表达式和上下文对象来构建抽象语法树,并使用该树来执行特定的操作。在Java中,可以使用抽象类和接口来实现这些组件,并使用它们来构建具体的表达式对象和解释器对象等。抽象表达式是一个抽象类或接口,它包含一个解释方法,该方法接受上下文对象作为参数,并返回解释结果。解释器模式的核心是通过使用抽象表达式对象来构建一个抽象语法树,并使用上下文对象来处理该树。它的基本原理是将一个表达式解析成一个抽象语法树,然后使用该树来执行特定的操作。原创 2023-02-25 21:37:34 · 156 阅读 · 0 评论 -
设计模式十五-命令模式
总之,命令模式是一种非常有用的设计模式,它可以帮助您将请求封装成对象,并提供一些额外的功能,如队列、记录、撤销等。在这个例子中,我们首先创建一个TV对象,然后创建一个打开电视机的命令和一个关闭电视机的命令。最后,我们执行遥控器的executeCommands方法,这将依次执行添加到命令列表中的所有命令。命令模式是一种行为设计模式,其主要目的是将一个请求封装成一个对象,从而使您可以使用不同的请求来参数化其他对象,并将请求队列或记录日志、撤销操作等功能提供给你的应用程序。原创 2023-02-25 21:31:24 · 83 阅读 · 0 评论 -
设计模式十四-职责链模式
职责链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许将请求沿着处理者链进行传递,直到有一个处理者能够处理请求为止。这种模式将请求的发送者和接收者分离开来,使得不同的处理者可以处理不同类型的请求,并且可以动态地改变请求的处理流程。具体处理者(ConcreteHandler):实现抽象处理者接口,负责处理请求,如果自己不能处理,则将请求转发给下一个处理者。抽象处理者(Handler):定义一个处理请求的接口,并且包含一个指向下一个处理者的引用。原创 2023-02-25 21:18:46 · 72 阅读 · 0 评论 -
设计模式十三-代理模式
在上面的代码中,我们创建了一个实际的文件读取器对象reader,并使用它来创建了一个文件读取器代理对象proxy。然后,我们使用代理对象proxy来读取文件,第一次读取时从实际文件读取器中获取,第二次读取时从缓存中获取。在上面的代码中,我们定义了一个文件读取器代理类FileReaderProxy,它包含了一个实际的文件读取器对象和一些额外的操作,例如权限检查和缓存。在代理模式中,代理对象充当了客户端和实际对象之间的中介,可以拦截客户端对实际对象的访问,以实现一些额外的功能,例如权限控制、缓存等。原创 2023-02-25 10:14:20 · 77 阅读 · 0 评论 -
设计模式十二-享元模式
享元对象包含了对象的内部状态和一些固定的属性和方法,而外部状态则包含了对象的变化属性和方法,这些属性和方法需要在运行时进行动态设置。为了最小化内存使用和提高性能,我们可以使用享元模式来共享新闻文章的相似部分,从而避免了创建大量相似的新闻文章对象。该模式的核心思想是将对象分为可共享和不可共享两类,对可共享的对象进行共享,从而避免了创建大量相似对象的开销。在上面的代码中,我们使用一个Map来维护已经创建的新闻文章对象,如果请求的新闻文章对象已经存在,则直接返回该对象;原创 2023-02-25 10:08:25 · 76 阅读 · 0 评论 -
设计模式十一-外观模式
外观模式是一种结构型设计模式,它提供了一个简单的接口,用于访问复杂系统的子系统,从而隐藏了子系统的复杂性。这个模式的核心思想是将客户端和子系统之间的通信通过一个外观类来解耦,从而使得客户端只需要和外观类交互,而不需要了解子系统的实现细节。其中,音频和视频播放都有自己的子系统,包括了解码器、渲染器等。在外观模式中,外观类充当了客户端与子系统之间的中介者,其内部封装了子系统的功能,并将其暴露给客户端使用。在上面的代码中,客户端只需要调用外观类的接口即可播放音频和视频文件,不需要了解内部子系统的实现细节。原创 2023-02-25 10:05:05 · 199 阅读 · 0 评论 -
设计模式十-装饰模式
装饰模式(Decorator Pattern)是一种结构型设计模式,它允许我们动态地给对象添加额外的功能,而不需要修改现有的代码。这种模式属于对象结构型模式,它能够在不改变原有对象结构的情况下,对其功能进行扩展和改变。通过装饰模式,我们可以动态地添加和组合对象的功能,而不需要改变对象本身。因此,装饰模式可以使得代码更加灵活和可维护,同时也能够减少类的数量和继承关系。接口的类都可以被视为一种披萨的配料,并且具有相同的接口。方法,因此在实现具体的配料时,只需要实现。接口来表示披萨的配料,并实现一个默认的。原创 2023-02-25 07:46:38 · 74 阅读 · 0 评论 -
设计模式九-组合模式
总之,组合模式是一种非常有用的设计模式,它可以帮助我们表示“部分-整体”的层次结构,并对其进行统一的操作。在Java中,我们可以使用抽象类和接口来实现组件的基类,并使用组合来构建组件的树形结构。通过组合模式,我们可以更加灵活地表示和操作复杂的层次结构,并提高代码的可维护性和可扩展性。可以看到,使用组合模式,我们可以方便地表示一个树形结构,并对其进行统一的操作。另外,组合模式还可以帮助我们在系统中添加新的组件类型,而无需修改现有的代码。例如,如果我们需要在上面的示例中添加一个新的组合节点类型。原创 2023-02-24 22:35:00 · 71 阅读 · 0 评论 -
设计模式八-桥接模式
在上面的示例中,我们创建了一个抽象类`Window`来表示窗口,并定义了一个`setWindowImpl()`方法来设置窗口的具体实现。我们还创建了一个接口`WindowImpl`来表示窗口实现的部分,并为不同的操作系统(Windows、Mac OS和Linux)创建了具体的窗口实现类。在客户端代码中,我们创建了不同操作系统上的窗口实例,并为它们设置不同的实现。然后,我们调用`draw()`方法来绘制窗口,每个窗口都调用其所关联的`WindowImpl`实例的`drawWindow()`方法来完成绘制。原创 2023-02-24 22:31:16 · 78 阅读 · 0 评论 -
设计模式七-适配器模式
假设我们有一个旧的音乐播放器,它能够播放MP3格式的音乐。我们需要将这个播放器与新的播放列表类集成起来,新的播放列表类可以播放不同的音乐格式,包括MP3、MP4和AVI等。适配器模式是一种结构型设计模式,它能够将一个接口转换成另一个客户端所期望的接口。适配器模式通常用于现有的系统与新系统的集成,或者两个不兼容的系统之间的集成。总之,适配器模式是一种非常有用的设计模式,可以帮助我们解决接口不兼容的问题,提高代码的复用性和扩展性。现在,我们需要将这个播放器适配到新的播放列表中,所以我们创建了一个新的接口。原创 2023-02-24 21:42:59 · 68 阅读 · 0 评论 -
设计模式六-原型模式
如果被复制的对象有引用类型的成员变量,那么这些成员变量将会被浅复制,而不是深复制。原型模式是一种常用的创建型设计模式,它通过复制现有对象来创建新对象,从而避免了重复创建对象的开销。由于复制对象比创建新对象的成本要低得多,因此使用原型模式能够提高程序的性能和效率。当一个对象需要在不同的上下文中多次使用时,可以使用原型模式来避免重复创建该对象,从而提高程序性能。当一个对象的创建过程比较复杂,需要消耗大量时间和资源时,可以使用原型模式来减少创建对象的开销。在上述示例中,当需要创建一个新的形状时,只需要调用。原创 2023-02-24 21:37:42 · 68 阅读 · 0 评论 -
设计模式一
Java 23种设计模式是根据《设计模式:可复用面向对象软件的基础》一书提出的,这些模式分为三种类型:创建型模式、结构型模式和行为型模式。以上就是Java 23种设计模式的简要介绍,每种模式都有其特定的应用场景和优缺点,开发者可以根据实际需求来选择适合的模式。原创 2023-02-23 21:15:42 · 59 阅读 · 0 评论 -
设计模式二-工厂方法模式
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式,通过定义一个接口来创建对象,但是将实际的对象创建过程交给子类来实现,从而使得工厂方法可以延迟到子类中进行。假设我们有一个图形类,其中包含一个绘制方法,我们需要根据用户的输入来创建不同的图形对象,并调用对应的绘制方法进行绘制。这样,我们就使用工厂方法模式来实现了根据用户的输入来创建不同的图形对象并调用对应的绘制方法的功能。下面以一个简单的例子来说明工厂方法模式的应用。原创 2023-02-23 21:17:49 · 113 阅读 · 0 评论 -
设计模式三-抽象工厂模式
抽象工厂模式使用一组相关的工厂方法来创建一组对象,这些工厂方法构成了一个工厂族,它们通常用于创建复杂对象或对象组。假设我们需要创建一个电子设备的抽象工厂,该工厂可以创建电视机、音响和电脑这三种产品,并且有三种不同的工厂实现,分别对应不同的品牌:华为、小米和苹果。对于每个工厂而言,它都可以生产对应品牌的所有产品。抽象工厂模式与工厂方法模式的主要区别在于,抽象工厂模式针对的是产品族,而工厂方法模式针对的是产品等级结构。可以看到,不同品牌的工厂生产出的产品是不同的,但是它们都符合对应的产品接口。原创 2023-02-24 09:13:34 · 96 阅读 · 0 评论 -
设计模式四-单例模式
总之,单例模式可以保证一个类只有一个实例,并且提供全局访问点。单例模式是一种常用的设计模式,在应用程序中经常被用到。下面我们以一个简单的例子来介绍单例模式的应用。假设我们有一个应用程序,该程序需要记录应用程序中所有的日志信息。在该方法中,我们使用了懒汉式的单例模式,即在第一次使用。对象,使用该对象记录了应用程序中的日志信息,并且通过。类是一个单例模式,因此我们可以保证只存在一个。对象,并且所有的日志信息都被记录在该对象中。对象,因此我们可以使用单例模式来实现它。在上述代码中,我们创建了一个。原创 2023-02-24 09:13:56 · 66 阅读 · 0 评论 -
设计模式五-建造者模式
假设我们要创建一个电脑对象,该电脑由 CPU、内存、硬盘等组件组成,我们可以使用建造者模式来实现该电脑对象的创建。该模式将对象的创建过程拆分为多个步骤,并使用一个指导者来协调这些步骤。每个步骤都有一个对应的建造者,用于实现该步骤的具体细节。建造者创建了一个电脑对象,并设置了该电脑的 CPU、内存、硬盘等组件的信息。通过建造者模式,我们可以在创建对象时逐步完成复杂的初始化过程,从而使代码更加清晰、易于维护。类,它包含了 CPU、内存、硬盘等组件的信息。建造者,它包含了 CPU、内存、硬盘等组件的信息。原创 2023-02-24 09:15:34 · 67 阅读 · 0 评论