23种设计模式的原理和使用场景

创建型模式(Creational Patterns)

  1. 工厂方法模式(Factory Method)

    • 原理: 定义一个创建对象的接口,但让子类决定实例化哪个类。这样可以将实例化的代码从应用程序的业务逻辑中解耦。
    • 使用场景: 当一个类无法预知它需要创建的对象的类,或者一个类希望由它的子类来指定所创建的对象时,可以使用工厂方法模式。
    • 示例: 披萨店中有不同种类的披萨,每种披萨都有自己的制作方法,可以用工厂方法来根据顾客的口味点不同种类的披萨。
  2. 抽象工厂模式(Abstract Factory)

    • 原理: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。客户端使用抽象接口来创建一组相关的产品对象。
    • 使用场景: 当需要创建一组相关对象的产品族,并且希望这些产品族之间具有一致性时,可以使用抽象工厂模式。
    • 示例: 在一个图形用户界面工具箱中,可能有不同的主题(如浅色主题和深色主题),每个主题都包含按钮、文本框和标签等组件,可以使用抽象工厂模式创建不同主题的组件。
  3. 建造者模式(Builder)

    • 原理: 将一个复杂对象的构建过程与其表示分离,使同样的构建过程可以创建不同的表示。将对象的构建过程封装到一个独立的建造者类中,客户端可以根据需要选择不同的建造者来构建对象。
    • 使用场景: 当创建对象的构建过程比较复杂,而且需要创建不同表示时,可以使用建造者模式。同时,建造者模式也可以用于创建具有相似属性但不同表示的对象。
    • 示例: 假设有一个汽车制造工厂,汽车由发动机、底盘和车身组成,不同型号的汽车可能需要不同类型的发动机、底盘和车身组件,可以使用建造者模式来构建汽车对象。
  4. 原型模式(Prototype)

    • 原理: 通过复制原型对象的方式创建新对象,而无需知道其具体的实现细节。原型模式可以提高对象创建的性能,同时可以避免复杂对象的初始化过程。
    • 使用场景: 当一个对象的创建过程比较复杂或者对象的初始化过程需要耗费大量时间时,可以使用原型模式。
    • 示例: 在游戏开发中,有时候需要创建大量相似的敌人角色或者道具对象,可以使用原型模式创建一个初始的敌人角色或者道具对象,然后通过复制原型对象来创建新对象。
  5. 单例模式(Singleton)

    • 原理: 确保一个类只有一个实例,并提供一个全局访问点。单例模式可以保证在程序中只存在一个对象实例,避免了不必要的对象创建和资源消耗。
    • 使用场景: 当一个类只需要一个实例来协调操作时,可以使用单例模式。例如,日志记录器、数据库连接池等。
    • 示例: 在一个多线程的应用程序中,可以使用单例模式创建一个线程池对象,所有的线程都可以共享这个线程池对象,避免了线程创建和销毁的开销。

结构型模式(Structural Patterns)

  1. 适配器模式(Adapter)

    • 原理: 将一个类的接口转换成客户希望的另一个接口。适配器模式可以让原本接口不兼容的类可以一起工作。
    • 使用场景: 当需要使用一个已经存在的类,但是其接口与系统中的其他接口不匹配时,可以使用适配器模式。
    • 示例: 假设有一个用于播放音乐的系统,其中已经存在一个名为MediaPlayer的接口用于播放音乐文件,现在需要播放一种新的音乐格式(如MP4),可以创建一个适配器来将MP4Player的接口适配到MediaPlayer接口。
  2. 桥接模式(Bridge)

    • 原理: 将抽象部分与实现部分分离,使它们可以独立变化。桥接模式通过组合的方式将抽象和实现进行分离。
    • 使用场景: 当一个类存在多个维度的变化时,可以使用桥接模式来将这些维度进行分离,从而使系统更加灵活。
    • 示例: 假设有一个形状类Shape和一个颜色类Color,其中形状类有CircleSquare两种形状,颜色类有RedBlue两种颜色,可以使用桥接模式将形状和颜色进行分离。
  3. 组合模式(Composite)

    • 原理: 将对象组合成树形结构以表示"部分-整体"的层次结构,使得客户对单个对象和组合对象的使用具有一致性。组合模式允许客户统一处理单个对象和组合对象。
    • 使用场景: 当需要表示对象的层次结构,并且希望客户统一处理单个对象和组合对象时,可以使用组合模式。
    • 示例: 在文件系统中,文件夹可以包含文件和其他文件夹,可以使用组合模式来表示文件系统的层次结构。
  4. 装饰器模式(Decorator)

    • 原理: 动态地给一个对象添加一些额外的职责,就扩展功能而言,装饰器模式比生成子类方式更为灵活。装饰器模式通过递归组合的方式来动态添加功能。
    • 使用场景: 当需要在不修改现有对象结构的情况下,动态地给对象添加功能时,可以使用装饰器模式。
    • 示例: 假设有一个Coffee接口,实现了该接口的类有SimpleCoffeeCoffeeWithMilk,可以使用装饰器模式给Coffee对象添加额外的功能,如SugarDecoratorChocolateDecorator等。
  5. 外观模式(Facade)

    • 原理: 为子系统中的一组接口提供一个统一的接口,以简化子系统的使用。外观模式提供了一个高层接口,隐藏了子系统的复杂性。
    • 使用场景: 当需要简化复杂系统的接口并提供一个统一的入口点时,可以使用外观模式。
    • 示例: 在一个电商网站中,可以创建一个名为OnlineShoppingFacade的外观类,封装了购物车、订单处理、支付等子系统的复杂逻辑,客户端可以直接使用OnlineShoppingFacade来进行购物。

行为型模式(Behavioral Patterns)

  1. 责任链模式(Chain of Responsibility)

    • 原理: 使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。责任链模式通过将接收者组成一条链,依次尝试处理请求。
    • 使用场景: 当有多个对象可以处理同一个请求,并且处理器之间的顺序可以灵活调整时,可以使用责任链模式。
    • 示例: 在一个在线客服系统中,可以创建多个处理器来处理不同类型的问题,例如普通问题处理器、投诉处理器、退款处理器等,这些处理器组成一条责任链来处理用户提交的问题。
  2. 命令模式(Command)

    • 原理: 将请求封装成对象,从而允许用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。命令模式将请求的发送者和接收者解耦。
    • 使用场景: 当需要将请求发送者与接收者解耦,并且需要对请求进行排队、记录日志、撤销等操作时,可以使用命令模式。
    • 示例: 在一个遥控器应用程序中,可以创建不同的命令对象,如TurnOnCommandTurnOffCommand,每个命令对象封装了执行特定操作的逻辑,遥控器可以通过按钮来触发这些命令对象。
  3. 解释器模式(Interpreter)

    • 原理: 给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。解释器模式通过定义一种语言文法和解释器来解释该语言。
    • 使用场景: 当需要解释一个特定的语言或者表达式,并且可以将该语言或表达式表示为一个语法树时,可以使用解释器模式。
    • 示例: 假设有一个简单的计算器语言,支持加法、减法、乘法和除法操作,可以使用解释器模式来实现该计算器语言的解释器,解释器可以解释用户输入的表达式并返回计算结果。
  4. 迭代器模式(Iterator)

    • 原理: 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。迭代器模式将集合与遍历算法分离。
    • 使用场景: 当需要遍历一个聚合对象,并且希望客户端代码与集合的具体实现解耦时,可以使用迭代器模式。
    • 示例: 在一个社交网络应用程序中,可以使用迭代器模式来遍历用户的关注列表,迭代器可以提供方法来逐个访问关注列表中的用户信息。
  5. 中介者模式(Mediator)

    • 原理: 用一个中介对象来封装一系列的对象交互,中介者使各个对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
    • 使用场景: 当多个对象之间存在复杂的交互关系,并且希望通过一个中介者来管理这些交互关系时,可以使用中介者模式。
    • 示例: 在一个图形用户界面应用程序中,可以使用中介者模式来管理不同组件之间的交互,如按钮点击触发事件、文本框内容改变更新其他组件等。
  6. 备忘录模式(Memento)

    • 原理: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后恢复到这个状态。备忘录模式允许在不暴露对象实现细节的情况下保存和恢复对象状态。
    • 使用场景: 当需要保存对象的历史状态,并且希望封装对象的状态保存和恢复逻辑时,可以使用备忘录模式。
    • 示例: 在一个文本编辑器应用程序中,可以使用备忘录模式来保存文档的历史状态,用户可以随时撤销和恢复对文档的修改操作。
  7. 观察者模式(Observer)

    • 原理: 定义了对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都会得到通知并自动更新。观察者模式将对象的状态和依赖关系解耦。
    • 使用场景: 当一个对象的状态改变需要通知其他对象,并且对象之间存在一对多的依赖关系时,可以使用观察者模式。
    • 示例: 在一个新闻发布系统中,可以使用观察者模式来通知订阅了该新闻类别的用户,当有新的新闻发布时,所有订阅了该类别的用户都会收到通知并更新新闻列表。
  8. 状态模式(State)

    • 原理: 允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。状态模式将对象的行为和状态封装成独立的状态对象。
    • 使用场景: 当一个对象的行为取决于它的状态,并且需要在不同状态下执行不同的行为时,可以使用状态模式。
    • 示例: 在一个自动售货机系统中,可以使用状态模式来表示售货机的不同状态,如有货、无货、投币中、出货中等,每个状态都有不同的行为。
  9. 策略模式(Strategy)

    • 原理: 定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。策略模式通过将算法封装成独立的策略对象来实现。
    • 使用场景: 当一个类需要在运行时选择算法的行为,并且希望将算法的实现和使用代码解耦时,可以使用策略模式。
    • 示例: 在一个电商网站中,可以根据不同的促销策略(如打折、满减、赠品等)来计算订单的最终价格,可以使用策略模式来实现不同的促销策略。
  10. 模板方法模式(Template Method)

    • 原理: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法模式通过定义一个算法的框架,并将一些步骤交由子类实现来实现算法的定制化。
    • 使用场景: 当有一系列操作需要按照特定顺序执行,并且某些步骤的具体实现可以由子类决定时,可以使用模板方法模式。
    • 示例: 在一个游戏中,可以创建一个Game类作为模板类,其中定义了游戏的初始化、开始、结束等操作,然后创建具体的游戏子类来实现这些操作的具体细节,如ChessMonopoly等。
  11. 访问者模式(Visitor)

    • 原理: 表示一个作用于某对象结构中的各元素的操作。可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式通过将操作封装成访问者对象来实现。
    • 使用场景: 当需要对一个复杂对象结构进行操作,并且希望在不修改对象结构的前提下添加新的操作时,可以使用访问者模式。
    • 示例: 假设有一个图形对象结构,包含圆形、矩形和三角形等图形对象,可以使用访问者模式创建一个AreaVisitor来计算每个图形对象的面积,创建一个PerimeterVisitor来计算每个图形对象的周长。

J2EE模式(J2EE Patterns)

  1. MVC模式(Model-View-Controller)

    • 原理: 将应用程序分为三个核心部分:模型(Model)、视图(View)和控制器(Controller)。模型负责处理应用程序的业务逻辑,视图负责显示数据给用户,控制器负责接收用户的输入并做出响应。
    • 使用场景: 当需要将应用程序的业务逻辑、数据展示和用户交互分离开来时,可以使用MVC模式。
    • 示例: 在一个网站开发中,可以将网站的业务逻辑(如用户信息管理、文章发布等)放在模型层,将网页的展示逻辑放在视图层,将用户的交互逻辑(如表单提交、页面跳转等)放在控制器层。
  2. 业务代表模式(Business Delegate)

    • 原理: 为表示层代码和业务服务代码之间的解耦,使用业务代表模式。业务代表模式提供了一个统一的接口,隐藏了业务服务的具体实现细节。
    • 使用场景: 当表示层需要访问远程业务服务时,并且希望通过一个统一的接口来访问业务服务时,可以使用业务代表模式。
    • 示例: 在一个电商网站中,可以使用业务代表模式来封装对商品服务、订单服务等远程业务服务的访问,表示层代码可以通过业务代表来访问这些服务,而不需要知道服务的具体实现细节。

数据来源于网络,仅供参考

  • 14
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值