0
点赞
收藏
分享

微信扫一扫

Arcgis Pro地理配准

目录

1. 简介

在软件开发工作中,设计模式的出现,不仅提高了代码的可读性、可维护性和可扩展性,还使得软件架构更加健壮和灵活。本文将详细介绍设计模式的分类、原理与实际应用场景,旨在帮助大家初步地了解和熟悉设计模式。

2. 设计模式的分类概述

设计模式主要分为三大类别:创建型模式、结构型模式和行为型模式。

创建型模式关注对象的创建过程,旨在实现对象的解耦和复用,包括单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。

结构型模式关注类或对象的组合方式,通过继承、组合等方式创建更加复杂的结构,包括适配器模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式和代理模式。

行为型模式关注对象之间的通信和协作,通过封装变化、解耦等方式来增强系统的灵活性和可维护性,包括策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式和解释器模式。

3. 设计模式详解

3.1 创建型模式(共5种)

3.1.1 单例模式(Singleton)

原理:确保一个类仅有一个实例,并提供一个全局访问点。
作用:控制实例的数量,避免产生多个对象消耗过多资源。或者设置全局访问点,保证数据一致性。
使用场景:适用于需要频繁访问共享资源或配置信息的场景。如日志记录器(确保所有日志通过一个实例进行处理)、数据库连接池(控制并限制数据库连接数)、线程池(控制线程的创建和销毁)。

3.1.2 工厂方法模式(Factory Method)

原理:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
作用:封装对象创建过程,将类的实例化推迟到子类中进行,有利于系统的扩展和维护。
使用场景: IO 类库(根据不同的文件类型创建不同的流对象)、GUI 组件(创建具体的按钮、文本框等,而不需要关心具体实现)。

3.1.3 抽象工厂模式(Abstract Factory)

原理:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
作用:提供了一种方式来封装一系列相关的工厂,使得它们可以协同工作。
使用场景:适用于需要创建一系列相关或相互依赖的对象时。例如,制造不同风格的家具套装(如现代风格、古典风格)、企业应用框架(提供数据库访问、事务处理、安全等不同层次的抽象)。

3.1.4 建造者模式(Builder):

原理:将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。
作用:简化复杂对象的创建过程,使代码更加清晰易读。
使用场景:需要生成的产品对象有复杂的内部结构,内部属性本身相互关联。例如,创建复杂的对象如 SQL 语句构建器、解析器、游戏中的角色创建(允许玩家自定义角色属性)。

3.1.5 原型模式(Prototype):

原理:用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。
作用:提供一种创建对象的快捷方式,特别是当创建成本高或者复杂时。
使用场景:复制复杂的对象,如深度克隆、浅克隆、在编辑器中复制选区、Web 应用中的页面缓存。

3.2 结构型模式(共7种)

3.2.1 适配器模式(Adapter)

原理:将一个类的接口转换成客户期望的另一个接口,使得原本由于接口不兼容而无法协同工作的类能够一起工作。
作用:解决接口不兼容的问题。
使用场景:不同规格的电源适配器、旧版本代码与新系统的集成、第三方 API 集成。

3.2.2 桥接模式(Bridge)

原理:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
作用:实现抽象与实现之间的解耦,使系统更加灵活,易于扩展。
使用场景:适用于变化多样且要求相互间不影响的场景,例如,图形编辑软件中的图形和渲染分离、不同数据库的访问抽象。

3.2.3 组合模式(Composite)

原理:将对象组合成树形结构以表示“部分-整体”的层次结构
作用:使得用户对单个对象和复合对象的使用具有一致性。。
使用场景:适用于需要处理具有层次结构数据的场景。例如,文件系统(文件和文件夹的层次结构)、组织结构图(员工和部门的层次结构)等。

3.2.4 装饰器模式(Decorator)

原理:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式相比生成子类更为灵活。
作用:提供了一种灵活的替代方案来扩展对象的功能,在不改变对象结构的情况下,动态地给对象添加职责。
使用场景:适用于动态添加功能到对象的场景。例如, Java IO 流的包装、动态地为类添加职责(如日志记录)。

3.2.5 外观模式(Facade)

原理:为子系统中的一组接口提供了一个统一的高层接口,使得子系统更容易使用。
作用:为复杂模块提供简单接口,降低了模块间的耦合度
使用场景:适用于简化复杂系统的接口或隐藏子系统细节的场景。例如,支付系统、ATM 机的界面、封装多个API接口的SDK。

3.2.6 享元模式(Flyweight)

原理:运用共享技术有效地支持大量细粒度对象的复用。
作用:减少了对象的数量,从而降低了内存占用,提高了性能。
使用场景:数据库中大量对象的缓存、编辑器中大量字符的共享、游戏中大量相似对象的优化。

3.2.7 代理模式(Proxy)

原理:为对象提供一个代理以控制对这个对象的访问,实现客户端与目标对象之间的解耦。
作用:代理对象可以在客户端和目标对象之间起到中介的作用,负责转发请求、添加额外的操作或进行权限控制等。
使用场景:适用于需要远程访问、延迟加载、访问控制、日志记录、事务管理等场景,以提高系统的灵活性和可维护性。

三、行为型模式(共11种)

3.3.1 策略模式(Strategy)

原理:定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。
作用:使得算法可以独立于使用它的客户端变化,提高了系统的灵活性和可扩展性
使用场景:适用于在运行时根据条件选择不同行为。如排序算法的选择、优惠策略的选择、游戏中的 AI 行为。

3.3.2 模板方法模式(Template Method)

原理:定义一个操作中的算法的骨架,将一些步骤延迟到子类中。
作用:在方法中定义了执行算法的步骤和顺序,但并不是所有的步骤都是实际执行,而是在某些步骤中调用抽象方法,由子类实现。
使用场景:定义算法的骨架,如 Java 中的 AbstractList、AbstractQueue 类。

3.3.3 观察者模式(Observer)

原理:定义对象之间的一对多依赖关系,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
作用:实现了表示层和数据逻辑层的分离,并定义了稳定的消息更新传递机制。
使用场景:常用于实现事件监听机制、模型-视图-控制器(MVC)架构、跨应用程序的数据同步。

3.3.4 迭代器模式(Iterator)

原理:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。
作用:使得在遍历一个对象的内容时,不需要暴露它的内部结构。
使用场景:遍历聚合对象,如集合框架中的迭代器、数据库结果集的遍历。

3.3.5 责任链模式(Chain of Responsibility)

原理:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
作用:将请求的发送者和多个请求处理者解耦,使多个对象都有机会处理请求,提高了系统的灵活性和可扩展性。
使用场景:适用于需要按照某种顺序依次处理请求,或者请求的处理需要多个对象协作完成的情况。例如,处理用户请求的流程、审批流程、编译器中的语法检查。

3.3.6 命令模式(Command)

原理:将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
作用:实现了请求者和执行者的解耦,提高了系统的灵活性和可维护性。
使用场景:适用于需要实现请求的撤销和重做功能。例如,撤销/重做功能、事务操作、遥控器的按键命令。

3.3.7 备忘录模式(Memento)

原理:在不破坏封装性的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
作用:保存对象的状态,以便在需要时能够恢复到该状态。
使用场景:需要保存对象状态以便后续恢复的场景。例如,游戏存档/读档、文档编辑器的快照功能、版本控制系统等。

3.3.8 状态模式(State)

原理:允许一个对象在其内部状态改变时改变它的行为。通过将对象的行为与其状态绑定,使得对象在不同状态下有不同的行为表现。
作用:根据对象的状态来执行不同的行为。
使用场景:适用于一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时。例如,网络连接的状态管理、订单状态管理、游戏中角色的状态变化。

3.3.9 访问者模式(Visitor)

原理:表示一个作用于某对象结构中的各元素的操作。它使用户可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
作用:在不修改类的前提下,增加新的操作。
使用场景:适用于需要在不修改元素类的情况下增加新的操作,或者需要对一个复杂对象中的元素进行不同的操作的情况。例如,如编译器中的语法树遍历、数据库查询语言的实现。

3.3.10 中介者模式(Mediator)

原理:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
作用:减少对象之间的耦合,使得对象不需要显式地相互引用。
使用场景:适用于系统中对象之间存在大量的交互,并且这些交互关系需要经常变化的情况。例如,群聊应用中的聊天室、在线游戏的多玩家交互、分布式系统中的服务协调。

3.3.11 解释器模式(Interpreter)

原理:给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
作用:提供了一种解释语言的机制,使得用户可以灵活地定义和扩展语言的语法规则,实现语言的解释执行。
使用场景:适用于实现特定语言的解释器。当需要实现一个特定的解释型语言时,如脚本引擎或表达式求值器。例如,编程语言的解释器、语法分析器、表达式求值。

举报

相关推荐

0 条评论