Java哪些设计模式比较常用

Java哪些设计模式比较常用:1、观察者模式;2、抽象工厂模式;3、单例设计模式;4、策略模式;5、适配器模式;6、命令模式;7、装饰器模式;8、外观模式;9、模板方法模式;10、状态模式。其中,观察者模式又称为发布-订阅模式,定义了对象之间一对多依赖关系。

一、观察者模式

观察者模式又称为发布-订阅模式,定义了对象之间一对多依赖关系,当目标对象(被观察者)的状态发生改变时,它的所有依赖者(观察者)都会收到通知。

观察者模式优点

  • 一个观察目标可以对应多个观察者,而这些观察者之间没有相互联系,所以能够根据需要增加和删除观察者,使得系统更易于扩展,符合开闭原则;
  • 并且观察者模式让目标对象和观察者松耦合,虽然彼此不清楚对方的细节,但依然可以交互,目标对象只知道一个具体的观察者列表,但并不认识任何一个具体的观察者,它只知道他们都有一个共同的接口。

观察者模式缺点

  • 如果存在很多个被观察者的话,那么将需要花费一定时间通知所有的观察者,如果观察者与被观察者之间存在循环依赖的话,那么可能导致系统崩溃,
  • 观察者模式没有相应的机制让观察者知道被观察对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

二、抽象工厂模式

抽象工厂模式主要用于创建相关对象的家族。当一个产品族中需要被设计在一起工作时,通过抽象工厂模式,能够保证客户端始终只使用同一个产品族中的对象;并且通过隔离具体类的生成,使得客户端不需要明确指定具体生成类;所有的具体工厂都实现了抽象工厂中定义的公共接口,因此只需要改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。

缺点:添加新的行为时比较麻烦,如果需要添加一个新产品族对象时,需要更改接口及其下所有子类,这必然会带来很大的麻烦。

三、单例设计模式

单例设计模式可以确保系统中某个类只有一个实例,该类自行实例化并向整个系统提供这个实例的公共访问点,除了该公共访问点,不能通过其他途径访问该实例。

单例模式的优点:

  • 系统中只存在一个共用的实例对象,无需频繁创建和销毁对象,节约了系统资源,提高系统的性能;
  • 可以严格控制客户怎么样以及何时访问单例对象。

单例模式的写法有好几种,主要有三种:懒汉式单例、饿汉式单例、登记式单例。

四、策略模式

将类中经常改变或者可能改变的部分提取为作为一个抽象策略接口类,然后在类中包含这个对象的实例,这样类实例在运行时就可以随意调用实现了这个接口的类的行为。比如定义一系列的算法,把每一个算法封装起来,并且使它们可相互替换,使得算法可独立于使用它的客户而变化,这就是策略模式

策略模式的优点:可以动态改变对象的行为;

策略模式的缺点:会产生很多策略类,并且策略模式的决定权在用户,系统只是提供不同算法的实现,所以客户端必须知道所有的策略类,并自行决定使用哪一个策略类。

五、适配器模式

适配器模式主要用于将一个类或者接口转化成客户端希望的格式,使得原本不兼容的类可以在一起工作,将目标类和适配者类解耦;同时也符合“开闭原则”,可以在不修改原代码的基础上增加新的适配器类;将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性,但是缺点在于更换适配器的实现过程比较复杂。

适配器模式适合的场景:

  • 系统需要使用现有的类,而这些类的接口不符合系统的接口。
  • 使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。

六、命令模式

命令模式的本质是将请求封装成对象,将发出命令与执行命令的责任分开,命令的发送者和接收者完全解耦,发送者只需知道如何发送命令,不需要关心命令是如何实现的,甚至是否执行成功都不需要理会。命令模式的关键在于引入了抽象命令接口,发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联。

命令模式的优势:降低了系统的耦合度,而且新命令可以很方便添加到系统中,也容易设计一个组合命令。

命令模式的缺点:会导致某些系统有过多的具体命令类,因为针对每一个命令都需要设计一个具体命令类。

七、装饰器模式

装饰器模式可以动态给对象添加一些额外的职责从而实现功能的拓展,在运行时选择不同的装饰器,从而实现不同的行为;比使用继承更加灵活,通过对不同的装饰类进行排列组合,创造出很多不同行为,得到功能更为强大的对象;符合“开闭原则”,被装饰类与装饰类独立变化,用户可以根据需要增加新的装饰类和被装饰类,在使用时再对其进行组合,原有代码无须改变。

八、外观模式

外观模式通过对客户端提供一个统一的接口,用于访问子系统中的一群接口。使用外观模式有以下几点好处:

  • 更加易用:使得子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟外观类交互就可以了;
  • 松散耦合:将客户端与子系统解耦,让子系统内部的模块能更容易扩展和维护。
  • 更好的划分访问层次:通过合理使用 Facade,可以更好地划分访问的层次,有些方法是对系统外的,有些方法是系统内部使用的。把需要暴露给外部的功能集中到门面中,这样既方便客户端使用,也很好地隐藏了内部的细节。

但是如果外观模式对子系统类做太多的限制则减少了可变性和灵活性,所以外观模式适用于为复杂子系统提供一个简单接口,提高系统的易用性场景 以及 引入外观模式将子系统与客户端进行解耦,提高子系统的独立性和可移植性。

九、模板方法模式

模板方法是基于继承实现的,在抽象父类中声明一个模板方法,并在模板方法中定义算法的执行步骤(即算法骨架)。在模板方法模式中,可以将子类共性的部分放在父类中实现,而特性的部分延迟到子类中实现,只需将特性部分在父类中声明成抽象方法即可,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤,不同的子类可以以不同的方式来实现这些逻辑。

模板方法模式的优点:符合“开闭原则”,也能够实现代码复用,将不变的行为转移到父类,去除子类中的重复代码。

模板方法模式的缺点:是不同的实现都需要定义一个子类,导致类的个数的增加使得系统更加庞大,设计更加抽象。

十、状态模式

状态模式,就是允许对象在内部状态发生改变时改变它的行为,对象看起来就好像修改了它的类,也就是说以状态为原子来改变它的行为,而不是通过行为来改变状态。

当对象的行为取决于它的属性时,我们称这些属性为状态,那该对象就称为状态对象。对于状态对象而言,它的行为依赖于它的状态,比如要预订房间,只有当该房间空闲时才能预订,想入住该房间也只有当你预订了该房间或者该房间为空闲时。对于这样的一个对象,当它的外部事件产生互动的时候,其内部状态就会发生变化,从而使得他的行为也随之发生变化。

拓展阅读

编程设计模式六大原则

  • 开闭原则(Open Close Principle):对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。
  • 里氏代换原则(Liskov Substitution Principle):里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
  • 依赖倒转原则(Dependence Inversion Principle):这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。
  • 接口隔离原则(Interface Segregation Principle):使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。
  • 迪米特法则,又称最少知道原则(Demeter Principle):一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。
  • 合成复用原则(Composite Reuse Principle):尽量使用合成/聚合的方式,而不是使用继承。

文章标题:Java哪些设计模式比较常用,发布者:E.Z,转载请注明出处:https://worktile.com/kb/p/51904

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
E.ZE.Z站长
上一篇 2023年5月12日
下一篇 2023年5月12日

相关推荐

  • 如何克服团队协作中的障碍和瓶颈

    摘要:在团队协作中,通讯、资源分配、目标一致性、个人态度、技能差异是常见的障碍和瓶颈。突破这些障碍需采取多元化策略。1、改善沟通涉及使用有效的沟通工具和技巧,实时信息共享;2、优化资源分配需要合理分配任务,确保资源充分利用;3、确保目标一致性通过透明的目标设定和共享愿景实现;4、调整个人态度包括鼓励…

    2023年11月28日
    600
  • html导航栏怎么做

    在HTML中创建导航栏涉及三个主要步骤:1、使用<nav>元素定义导航区域;2、使用<ul>和<li>元素创建链接列表;3、使用CSS样式自定义外观。其中,使用<nav>元素是HTML5中引入的语义化标签,有助于提高网站的可访问性和SEO效果。本文将详细介绍如何结合HTML和…

    2023年8月16日
    16000
  • 开发exe程序一般用什么软件

    开发exe程序可以用这些软件:1、C++ Builder;2、Visual Studio;3、Lazarus;4、Electron;5、Qt;6、Delphi。C++ Builder是一种强大的应用程序开发工具,可以通过C++语言来编写Windows.exe程序。 1、C++ Builder C++…

    2023年4月15日
    1.4K00
  • 先进制造的企业都在使用哪些项目管理工具

    在当今竞争激烈的先进制造领域,企业为了提升项目效率和质量,采用了一系列的项目管理工具。这些工具包含了项目规划、团队协作、资源管理、风险评估、进度跟踪,以及质量控制。项目管理工具能够确保制造流程在快速变化的市场和技术环境中保持高效和灵活。这些工具通常涵盖1、甘特图与关键路径法、2、敏捷与Scrum框架…

    2023年11月13日
    1700
  • python与opencv处理图片的区别在哪里

    python与opencv处理图片的区别在:1、功能性不同;2、应用场景不同;3、性能差异;4、学习曲线不同。Python是一种高级编程语言,可以通过第三方库或内置模块来处理图片,例如Pillow、matplotlib等。OpenCV是一个专门用于计算机视觉任务的开源计算机视觉库。 一、功能性不同 …

    2023年7月30日
    13900
  • 成功人士进!怎么可以更好地接收到客户的反馈

    在企业运营的过程中,很重要的一个步骤是与客户沟通。客户的反馈对于企业来说是很宝贵的。好的企业是可以满足到客户大部分的需求,这样客户才会在万千选择中选中你。俗话说得好:客户是我们的衣食父母。没有客户、没有订单,企业无法生存,更谈不上发展。   客户反馈的两种方式 1.由公司发起 企业发起的倾…

    2023年7月28日
    11400
  • 项目经理的管理目标有哪些

    项目经理的管理目标有:一、大目标;二、阶段目标;三、项目目标;四、角色执行目标。而往往远期目标是很大的,所谓千里之行始于足下,需要将大目标量化,并且逐渐向各级拆解,在多少时间内达到一个什么样量化指标。 一、大目标 凡事儿都得有目标,没有目标一切就会不可控,因为你不知道在做什么,什么时候得做完,现在怎…

    2023年4月29日
    22800
  • 需求优先级排序的基本原则是什么

    需求优先级排序的基本原则:1、客户需求优先级高于用户需求;2、确定的需求优先级高于不确定的需求;3、响应需求必须考虑投入产出比。客户需求优先级高于用户需求是指,客户作为一种特殊的用户类型,为产品买单,在产品应用上,有更大的话语权。

    2023年1月8日
    49500
  • 知识库与数据库有何不同

    摘要:知识库与数据库这两个概念在功能和目的上存在显著差异。知识库主要用于存储和管理经过组织的知识,方便快速检索,而数据库主要存储结构化数据,便于高效处理和查询。两者的核心差异可以归纳为:1、数据组织方式;2、内容类别;3、使用目的;4、技术实现。知识库侧重于提供方便用户理解和应用的信息,而数据库专注…

    2023年11月15日
    2700
  • cdr和cad的区别

    本文将深入探讨CDR和CAD两种文件格式的不同之处。文章主要内容包括:1. CDR和CAD的定义及用途,2. CDR和CAD在设计和工程中的应用,3. CDR和CAD文件格式的优劣比较,4. 如何选择适当的文件格式。简言之,CDR主要是一种由CorelDRAW软件创建的矢量图形文件格式,主要用于图形…

    2023年8月4日
    20700

发表回复

登录后才能评论
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部