结构型设计模式关注如何将类或对象组合成更大、更复杂的结构,同时保持结构的灵活性和高效性。在软件工程,尤其是构建互联网信息服务(如Web应用、API服务、微服务架构)时,这些模式为解决模块间的组织、通信和依赖关系提供了经典方案。本文将聚焦7种结构型模式的类图核心结构,并选取其中4种,深入解析其在典型互联网信息服务场景下的应用。
一、 7种结构型模式类图结构精要
- 适配器模式 (Adapter):
- 核心结构: 包含一个
Target(目标接口)、一个Adaptee(被适配者)和一个Adapter(适配器)。Adapter类继承或组合Adaptee,并实现Target接口,在其方法内部调用Adaptee的特定方法,完成接口转换。类图呈现为Adapter与Target之间为“实现”关系,与Adaptee之间为“组合”或“继承”关系。
- 桥接模式 (Bridge):
- 核心结构: 将抽象部分(
Abstraction)与其实现部分(Implementor)分离。Abstraction维护一个对Implementor的引用。两者都有各自的继承体系(RefinedAbstraction和ConcreteImplementor),可以独立变化。类图中表现为Abstraction聚合(菱形空心箭头)一个Implementor。
- 组合模式 (Composite):
- 核心结构: 用于表示“部分-整体”的树形结构。定义了一个统一的组件接口
Component,声明了add、remove、getChild等管理子组件的方法以及operation操作。Leaf(叶子)和Composite(容器)都实现Component接口。Composite对象持有Component对象的集合。类图呈现为Composite与Component之间是“聚合”关系,且两者都实现/继承自Component。
- 装饰器模式 (Decorator):
- 核心结构: 动态地给一个对象添加额外职责。
Decorator类实现与Component相同的接口,并持有一个Component对象的引用。ConcreteDecorator继承Decorator,在调用被装饰对象的操作前后添加新行为。类图呈链式结构,Decorator聚合Component。
- 外观模式 (Facade):
- 核心结构: 为子系统中的一组接口提供一个统一的高层接口(
Facade)。Facade类知晓子系统中各个类(SubsystemClasses)的职责,并将客户端请求委派给相应的子系统对象。类图中Facade与多个子系统类之间为单向关联。
- 享元模式 (Flyweight):
- 核心结构: 运用共享技术有效支持大量细粒度对象。包含
Flyweight(抽象享元)、ConcreteFlyweight(具体享元,可共享)和UnsharedConcreteFlyweight(非共享享元)。FlyweightFactory(享元工厂)负责创建和管理享元对象。类图中工厂聚合享元池。
- 代理模式 (Proxy):
- 核心结构: 为其他对象提供一种代理以控制对这个对象的访问。
Proxy和RealSubject都实现Subject接口。Proxy持有对RealSubject的引用,并在其方法中可能进行访问控制、懒加载、日志记录等附加操作。类图中Proxy与RealSubject关联,并共实现Subject。
二、 4种模式在互联网信息服务中的典型应用
互联网信息服务通常具有高并发、分布式、模块化等特点,以下四种结构型模式应用尤为广泛:
- 适配器模式:整合异构第三方服务
- 应用场景: 系统需要接入多个外部服务提供商(如不同银行的支付接口、多个地图服务商的API、各类云存储服务)。这些服务接口规范各异。
- 应用解析: 定义系统内部统一的支付接口
PaymentService(Target)。为每个第三方服务(如AliPaySDK、WeChatPaySDK)创建对应的适配器类(如AliPayAdapter),实现PaymentService,并在其pay()方法内部调用第三方SDK特有的方法,完成参数转换和调用封装。这样,业务逻辑仅依赖统一的接口,与具体服务商解耦。
- 外观模式:简化复杂微服务或模块调用
- 应用场景: 一个电商下单流程涉及用户服务、库存服务、优惠券服务、支付服务等多个微服务或复杂模块。前端或API网关直接调用这些服务繁琐且易错。
- 应用解析: 创建
OrderFacade(订单外观)类。它内部聚合或调用用户、库存、优惠券、支付等子系统的客户端或接口。对外提供一个简洁的方法如placeOrder(orderInfo)。在该方法内,外观类按顺序协调各个子系统的调用(验证用户、扣减库存、计算优惠、发起支付),向客户端隐藏了复杂的交互细节,提供了易用的接口,并降低了系统间的耦合度。
- 代理模式:实现访问控制与增强
- 应用场景: 需要对敏感操作(如管理后台API、付费内容访问)进行权限校验;或需要对服务调用添加缓存、限流、日志、监控等横切关注点。
- 应用解析:
- 保护代理: 定义
DataService接口及其真实实现RealDataService。创建AuthProxy,实现DataService并在其getSensitiveData()方法中首先检查用户token和权限,通过后才调用RealDataService的相应方法。
- 远程代理/Cache代理: 在客户端,代理可以代表一个位于远程的服务对象(如RPC存根)。或者,
CacheProxy在调用真实数据库查询服务前,先检查本地/分布式缓存,命中则直接返回,否则调用真实服务并回填缓存。这在Web服务中极为常见。
- 装饰器模式:灵活扩展HTTP中间件/过滤器链
- 应用场景: 在Web框架(如Express.js, Koa, Spring MVC)中,需要对HTTP请求/响应处理流程添加多种功能,如GZIP压缩、身份认证、请求日志、数据格式化等,且这些功能需要能灵活组合。
- 应用解析: 将核心的请求处理器定义为
Handler接口(Component)。基础处理器ConcreteHandler处理核心业务。每个中间件(如AuthDecorator、LoggingDecorator、CompressionDecorator)都是一个装饰器,实现Handler接口并持有下一个Handler的引用。在装饰器的handleRequest(request)方法中,可以在调用下一个处理器之前(如进行认证)、之后(如记录日志)或前后(如压缩响应)添加自己的逻辑。通过链式组合这些装饰器,可以动态地构建出功能丰富的处理管道,符合“开闭原则”。
###
理解结构型模式的类图是掌握其静态关系的基础,而结合互联网信息服务的具体场景(整合、简化、控制、扩展)来理解其动态行为和应用价值,则能真正融会贯通。在系统设计,尤其是应对服务集成、架构简化、功能增强和流程扩展等需求时,合理选用适配器、外观、代理、装饰器等模式,能显著提升代码的可维护性、可扩展性和复用性。