Java设计模式 - 示例教程

Java设计模式 - 示例教程

设计模式在软件开发人员中非常流行。设计模式是针对常见软件问题的良好描述的解决方案。我已经写了很多关于java设计模式的文章。您可以订阅我们的时事通讯下载PDF电子书(130多页)。

 

Java设计模式

使用设计模式的一些好处是:

  1. 设计模式已经定义,并提供行业标准方法来解决重复出现的问题,因此如果我们明智地使用设计模式,它可以节省时间。我们可以在基于java的项目中使用许多java设计模式。
  2. 使用设计模式可以提高可重用性,从而实现更强大和高度可维护的代码。它有助于降低软件产品的总体拥有成本(TCO)。
  3. 由于已经定义了设计模式,因此它使我们的代码易于理解和调试。它可以加快开发速度,团队的新成员可以轻松地理解它。

Java设计模式分为三类 - 创建结构行为设计模式。这篇文章作为我到目前为止所写的所有java设计模式文章的索引。

设计模式视频教程

最近我开始了关于设计模式的视频教程,并将它们上传到YouTube上。请订阅我的YouTube频道,因为我打算在Core Java,Spring Framework等上上传更多视频。

 

创作设计模式

创建设计模式提供了针对特定情况以最佳方式实例化对象的解决方案。

单例模式

Singleton模式限制类的实例化,并确保java虚拟机中只存在该类的一个实例。它似乎是一个非常简单的设计模式,但是当涉及到实现时,它会带来很多实现问题。Singleton模式的实现一直是开发人员争议的话题。查看Singleton Design Pattern,了解实现Singleton模式的不同方法以及每种方法的优缺点。这是最常讨论的java设计模式之一。

工厂模式

当我们有一个具有多个子类的超类并且基于输入时,使用工厂设计模式,我们需要返回其中一个子类。此模式负责将类从客户端程序实例化到工厂类。我们可以在Factory类上应用Singleton模式或使工厂方法静态。查看工厂设计模式,例如程序和工厂模式的好处。这是最广泛使用的java设计模式之一。

抽象工厂模式

抽象工厂模式类似于工厂模式,它是工厂的工厂。如果您熟悉java中的工厂设计模式,您会注意到我们有一个Factory类,它根据提供的输入返回不同的子类,工厂类使用if-else或switch语句来实现这一点。

在抽象工厂模式中,我们摆脱if-else块并为每个子类创建一个工厂类,然后是一个Abstract Factory类,它将根据输入工厂类返回子类。查看抽象工厂模式以了解如何使用示例程序实现此模式。

生成器模式

当Object包含许多属性时,引入此模式是为了解决Factory和Abstract Factory设计模式的一些问题。Builder模式通过提供逐步构建对象的方法并提供实际返回最终Object的方法,解决了大量可选参数和不一致状态的问题。查看Builder Pattern,了解JDK中使用的示例程序和类。

原型模式

当对象创建是一项代价高昂的事情并且需要大量时间和资源并且您已经存在类似对象时,将使用原型模式。因此,此模式提供了一种机制,可将原始对象复制到新对象,然后根据需要对其进行修改。此模式使用Java克隆来复制对象。

原型设计模式要求您复制的对象应提供复制功能。它不应该由任何其他类完成。但是,是否使用对象属性的浅或深副本取决于要求,这是一个设计决策。查看原型模式以获取示例程序。

结构设计模式

结构模式提供了创建类结构的不同方法,例如使用继承和组合从小对象创建大对象。

适配器模式

适配器设计模式是结构设计模式之一,它的使用使得两个不相关的接口可以一起工作。连接这些不相关接口的对象称为适配器。作为一个真实的例子,我们可以将移动充电器视为适配器,因为移动电池需要3伏充电才能正常插座产生120V(美国)或240V(印度)。因此,移动充电器可作为移动充电插座和墙壁插座之间的适配器。查看适配器模式以获取示例程序及其在Java中的用法。

复合图案

复合模式是结构设计模式之一,在我们必须表示部分整体层次结构时使用。当我们需要以一种必须以相同方式处理结构中的对象的方式创建结构时,我们可以应用复合设计模式。

让我们用一个真实的例子来理解它 - 一个图是一个由诸如圆形,线条,三角形等对象组成的结构,当我们用颜色填充图形(比如红色)时,相同的颜色也会被应用到对象中。画画。这里的图纸由不同的部分组成,它们都有相同的操作。查看复合模式文章,了解复合模式和示例程序的不同组件。

代理模式

代理模式意图是“为另一个对象提供代理或占位符以控制对它的访问”。定义本身非常清晰,当我们想要提供功能的受控访问时,使用代理模式。

假设我们有一个可以在系统上运行某个命令的类。现在,如果我们使用它,它很好,但如果我们想将此程序提供给客户端应用程序,它可能会有严重的问题,因为客户端程序可以发出命令删除一些系统文件或更改一些您不想要的设置。查看具有实现细节的示例程序的代理模式帖子。

Flyweight模式

当我们需要创建一个类的很多对象时,使用Flyweight设计模式。由于每个对象都占用对于低内存设备(例如移动设备或嵌入式系统)至关重要的内存空间,因此可以应用flyweight设计模式以通过共享对象来减少内存负载。java中的String Pool实现是Flyweight模式实现的最佳示例之一。查看Flyweight Pattern文章,了解示例程序和实现过程。

门面模式

Facade Pattern用于帮助客户端应用程序轻松与系统交互。假设我们有一个带有一组接口的应用程序来使用MySql / Oracle数据库并生成不同类型的报告,例如HTML报告,PDF报告等。因此我们将有不同的接口集来处理不同类型的数据库。现在,客户端应用程序可以使用这些接口来获取所需的数据库连接并生成报告。但是当复杂性增加或界面行为名称令人困惑时,客户端应用程序将难以管理它。因此,我们可以在此处应用Facade模式,并在现有界面之上提供包装器界面以帮助客户端应用程序。查看Facade Pattern帖子了解实施细节和示例程序。

桥模式

当我们在两个接口和实现中都有接口层次结构时,桥接设计模式用于将接口与实现分离,并将实现细节隐藏在客户端程序中。像适配器模式一样,它是结构设计模式之一。

桥接设计模式的实现遵循组合优于继承的概念。查看Bridge Pattern帖子了解实施细节和示例程序。

装饰图案

装饰器设计模式用于在运行时修改对象的功能。同时,同一类的其他实例不会受此影响,因此单个对象将获得已修改的行为。装饰器设计模式是结构设计模式之一(如Adapter Pattern,Bridge Pattern,Composite Pattern),并使用抽象类或接口与组合来实现。

我们使用继承或组合来扩展对象的行为,但这是在编译时完成的,它适用于该类的所有实例。我们无法在运行时添加任何删除任何现有行为的新功能 - 这就是Decorator模式出现的时候。查看Decorator Pattern帖子,了解示例程序和实现细节。

行为设计模式

行为模式为对象之间更好的交互提供了解决方案,以及如何提供丢失耦合和灵活性以便轻松扩展。

模板方法模式

模板方法是一种行为设计模式,它用于创建方法存根,并将一些实现步骤推迟到子类。Template方法定义了执行算法的步骤,它可以提供可能对所有或部分子类通用的默认实现。

假设我们想提供一个算法来建造房屋。建造房屋需要采取措施 - 建筑基础,建筑支柱,建筑墙壁和窗户。重要的是,我们不能改变执行的顺序,因为我们无法在构建基础之前构建窗口。所以在这种情况下,我们可以创建一个模板方法,使用不同的方法来构建房子。使用示例程序查看模板方法模式帖子以获取实现细节。

调解员模式

介体设计模式用于在系统中的不同对象之间提供集中式通信介质。介体设计模式在多个对象相互交互的企业应用程序中非常有用。如果对象直接相互交互,则系统组件彼此紧密耦合,这使得可维护性成本更高并且不易灵活地扩展。Mediator模式侧重于在对象之间提供中介以进行通信,并帮助实现对象之间的失败耦合。

空中交通管制员是调解员模式的一个很好的例子,其中机场控制室作为不同航班之间通信的调解员。Mediator作为对象之间的路由器,它可以拥有自己的逻辑来提供通信方式。使用示例程序查看Mediator Pattern帖子了解实现细节。

责任链模式

责任链模式用于在软件设计中实现丢失耦合,其中来自客户端的请求被传递到对象链以处理它们。然后链中的对象将自己决定谁将处理请求以及是否需要将请求发送到链中的下一个对象。

我们知道在try-catch块代码中我们可以有多个catch块。这里每个catch块都是处理该特定异常的处理器。因此,当try块中发生任何异常时,它将被发送到第一个catch块进行处理。如果catch块无法处理它,它会将请求转发到链中的下一个对象,即下一个catch块。如果即使最后一个catch块也无法处理它,那么异常将被抛出链接到调用程序。

ATM分配机逻辑可以使用责任链模式来实现,检查链接的帖子。

观察者模式

当您对对象的状态感兴趣并希望在有任何更改时收到通知时,观察者设计模式非常有用。在观察者模式中,监视另一个对象状态的对象称为Observer,正在监视的对象称为Subject

Java提供了内置平台,用于通过java.util.Observable类和java.util.Observer接口实现Observer模式。但是它没有被广泛使用,因为实现非常简单,并且大多数时候我们不希望最终扩展类只是为了实现Observer模式,因为java不在类中提供多重继承。

Java消息服务(JMS)使用Observer模式和Mediator模式来允许应用程序订阅数据并将数据发布到其他应用程序。查看Observer Pattern帖子了解实现细节和示例程序。

战略模式

当我们为特定任务使用多个算法时,使用策略模式,客户端决定在运行时使用的实际实现。

策略模式也称为策略模式。我们定义了多个算法,让客户端应用程序通过算法将其用作参数。这种模式的最好例子之一是采用Comparator参数的Collections.sort()方法。基于Comparator接口的不同实现,对象将以不同的方式进行排序。

查看Strategy Pattern帖子了解实现细节和示例程序。

命令模式

命令模式用于在请求 - 响应模型中实现丢失耦合。在命令模式中,请求被发送到调用者并且调用者将其传递给封装的命令对象。Command对象将请求传递给Receiver的相应方法以执行特定操作。

假设我们想要提供一个文件系统实用程序,其中包含打开,写入和关闭文件的方法,它应该支持多种操作系统,如Windows和Unix。

要实现我们的文件系统实用程序,首先我们需要创建实际完成所有工作的接收器类。由于我们使用java接口进行编码,因此我们可以使用FileSystemReceiver接口及其针对不同操作系统风格(如Windows,Unix,Solaris等)的实现类 。使用示例程序查看命令模式帖子以获取实现细节。

国家格局

当Object根据其内部状态更改其行为时,将使用状态设计模式。

如果我们必须根据对象的状态更改对象的行为,我们可以在Object中有一个状态变量,并使用if-else条件块根据状态执行不同的操作。状态模式用于提供通过上下文和状态实现实现此目的的系统和丢失耦合方式。

使用示例程序查看State Pattern帖子了解实现细节。

访客模式

当我们必须对一组相似类型的对象执行操作时,使用访问者模式。借助访问者模式,我们可以将操作逻辑从对象移动到另一个类。

例如,想一下我们可以添加不同类型的项目(元素)的购物车,当我们点击结帐按钮时,它会计算要支付的总金额。现在我们可以在项类中使用计算逻辑,或者我们可以使用访问者模式将此逻辑移出到另一个类。让我们在访客模式的例子中实现这一点。查看访客模式帖子了解实施细节。

口译员模式

用于定义语言的语法表示,并提供解释器来处理该语法。

此模式的最佳示例是java编译器,它将java源代码解释为JVM可理解的字节代码。Google Translator也是解释器模式的一个示例,其中输入可以是任何语言,我们可以使用另一种语言来解释输出。

查看解释器模式帖子,例如程序。

迭代器模式

Iterator模式在其中一个行为模式中,它用于提供遍历一组对象的标准方法。Iterator模式广泛用于Java Collection Framework,其中Iterator接口提供遍历集合的方法。

迭代器模式不仅仅是遍历集合,我们可以根据我们的要求提供不同类型的迭代器。Iterator模式通过集合隐藏实际的遍历实现,客户端程序只使用迭代器方法。查看Iterator Pattern帖子,了解示例程序和实现细节。

纪念品模式

当我们想要保存对象的状态以便稍后可以恢复时,使用Memento设计模式。Memento模式用于实现这一点,使得对象的保存状态数据不能在对象外部访问,这保护了已保存状态数据的完整性。

Memento模式由两个对象实现 - Originator和Caretaker。Originator是需要保存和恢复其状态的对象,它使用内部类来保存Object的状态。内部类称为Memento,它是私有的,因此无法从其他对象访问它。

查看Memento Pattern以获取示例程序和实现细节。

 

这就是java中不同设计模式的全部内容,这篇文章的目的是提供一个索引来轻松浏览所有这些模式。

 

转载来源:https://www.journaldev.com/1827/java-design-patterns-example-tutorial

猜你喜欢

转载自blog.csdn.net/Aria_Miazzy/article/details/85541052