讲师中心 微信公众号
AI工具推荐 视频效率加速

软件设计模式和原则

浅磊吖_5519

浅磊吖_5519

发布时间:2024-06-06 14:21:20

|

778人浏览过

|

来源于DZone

原创

设计模式是一组模板,可简化软件开发过程,提升代码的质量和一致性。它们按类型分为:创建模式(处理对象创建)、行为模式(定义对象交互方式)和结构模式(用于组织类和对象)。本文重点讨论代理模式,一种结构模式,它充当其他对象的中介,提供统一的访问方式并允许灵活控制。代理模式尤其适用于分布式系统,允许客户端与远程服务交互,同时隐藏底层通信细节。

软件设计模式和原则

设计模式是软件架构师在一段时间内制定的一组模板。它们是软件程序员可以应用于自己的软件/应用程序开发的最佳实践。它们通过重用预先存在的解决方案节省时间和精力,同时提高代码的质量和一致性,从而提供了令人难以置信的优势。它还可以帮助增强与其他开发人员的沟通和协作,促进代码的适应和发展,并防止常见的陷阱和错误。总而言之,设计模式是简化编程过程的好方法。 

广义上讲,有三种模式:结构模式,创建模式和行为模式。

创建模式与对象的创建有关,并将对象的创建与使用该对象的客户端分开。示例包括单例、工厂和工厂方法。 

行为模式定义多个对象如何相互作用。命令模式、迭代器模式和观察者模式是一些常见的行为模式。这些模式展示了系统的不同组件如何相互行为和响应。它可以通过增强灵活性、模块化和可重用性来改进代码。

另一方面,结构模式处理类和对象的组成和组织。它可以通过将类和对象组合成更大的结构来隐藏系统的复杂性。示例包括适配器、复合、装饰器、外观和代理。

虽然设计模式是一种久经考验的解决方案,但它们是在良好的面向对象编程原则的基础上形成的。以下列出了一些关键原则:

  • 针对接口进行编程:保持设计的灵活性。

  • 确定软件中可能变化的部分,并将它们与变化的部分分开:保持设计模块化

  • 倾向于组合而不是继承: 用单个对象组成大型结构。

  • 松散耦合: 尽量减少对象的相互依赖。

  • 开放/封闭原则: 类软件一旦代码完成、测试和验证,就应该对修改关闭,但该类可以通过继承的方式对扩展开放。

  • 依赖反转:依赖于抽象或接口而不是类的具体实例。

  • 单一责任原则: 一个类只负责一个需求。

示例:代理模式

我们选择了结构代理模式进行讨论。这是一种流行的模式,尤其在分布式系统中用作远程代理。顾名思义,代理模式是其他人的代理。代理设计的类提供面向公众的 API,客户端可以使用这些 API 发送请求。代理类具有访问真实对象服务的方法,并且可以在对来自客户端的请求进行身份验证之后向其提供请求。此外,代理模式可以允许延迟初始化。如果真实 对象的创建被认为是昂贵的,我们可以仅在客户端需要时延迟其实例化。它还允许日志记录和缓存,这些可以在代理类方法中实现。在分布式系统中,客户端和代理对象位于一个节点上,而为请求提供服务的实际对象位于另一个节点上,代理模式允许统一视图,客户端不知道哪个节点正在为该对象提供服务。 

图 1:代理模式

图 1:代理模式

图 1 显示了代理模式的架构图。它有一个包含ProxyObject句柄的客户端类。ProxyClass和RealClass 都派生自iProxy 接口类并实现 API。为了能够在两个节点之间进行通信,它们都另外有一个CommObject  ,负责在网络上共享 时对命令和数据进行序列化和反序列化。代码片段提供了一组最小的类和方法声明,以直观地展示分布式系统如何协同运行。

// CommClass 提供序列化/反序列化
// 在分布式系统中,共享数据和命令
class CommClass {
  // RealClass 向 CommClass 注册一个回调来接收命令
  // 以及来自代理的数据
  typedef std::function<void(unsigned, vector<unsigned>)> fCallBack;
  
  public:
  CommClass() {}
~CommClass() {}
  // 代理类使用 CommClass 对象向远程服务发送命令和数据
  void sendToRemoteService(unsigned cmd, std::vector<unsigned> data);
   // 远程服务类通过事件通知。它使用已注册的回调
    // 调用远程服务 RealClass
  void receiveFromProxy(unsigned cmd, std::vector<unsigned> data)
    {
    _cb(cmd, data);
    }
  
  void registerCallBack(fCallBack cb) { _cb = cb; }
  
  private:
  fCallBack _cb;
  
};
// 代理接口类声明面向公共的方法
class iProxy {
  public:
  iProxy() {}
  virtual ~iProxy() {}
  
  virtual void methodOne() = 0;
  virtual void methodTwo() = 0;
};
// 实现接口类方法的具体类和
// 与客户端位于同一节点
class ProxyClass : public iProxy {
  public:
  ProxyClass() {};
  ~ProxyClass() {};
  
     // 实现接口
  void methodOne() {};
  void methodTwo() {};
  
  private:
  CommClass CommObject;
  
};
// 实现代理接口方法并作为服务提供者的真实类
class RealClass : public iProxy {
  public:
    RealClass() {};
    ~RealClass() {};
  
    // 实现接口
    void methodOne() {};
    void methodTwo() {};
  private:
  CommClass CommObject;
  
};

结论

示例代理模式是任何软件工程师的箭筒中的重要箭头。通过使用组合原则,我们可以控制对内部对象的访问,添加额外的逻辑(例如缓存和 API 日志记录)以及增加安全性。它允许延迟初始化,这在资源受限的环境中很有用。确实存在某些缺点,例如增加开销和复杂性,因此,这不是一个万能的解决方案。  

虽然代理模式为许多常见的设计挑战提供了强大的解决方案,但任何设计模式都应谨慎使用,以免使您的设计过于复杂。始终从较简单的面向对象原则开始,然后在您的架构开始类似于特定模式时切换到设计模式。

热门AI工具

更多
创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

2133

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

3434

2023.10.07

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

7195

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

362

2025.11.27

C++ 面向对象编程与设计模式实践
C++ 面向对象编程与设计模式实践

本专题整合了 C++ 面向对象编程的核心机制,涵盖类的定义与访问控制、构造函数与析构函数、拷贝语义与移动语义、继承与虚函数多态、抽象类与接口、运算符重载、友元函数等关键知识点,同时结合单例模式、工厂模式、观察者模式、策略模式等常用设计模式的 C++ 实现,帮助开发者写出结构清晰、易于维护的面向对象代码。

364

2026.04.09

Java 面向对象与核心编程机制
Java 面向对象与核心编程机制

系统讲解 Java 面向对象编程的核心知识体系,涵盖类的定义与封装、构造方法与 this/super 关键字、继承与方法重写、多态与向上向下转型、抽象类与接口的区别与设计原则、异常处理机制(try-catch-finally / 自定义异常)、泛型的类型参数与通配符、集合框架(List/Set/Map)的使用与遍历方式,帮助开发者全面掌握 Java 程序设计的核心机制与面向对象思维。

243

2026.04.17

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3208

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5209

2025.10.17

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

0

2026.11.02

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 8.1万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.3万人学习

前端进阶之JavaScript设计模式
前端进阶之JavaScript设计模式

共22课时 | 2.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn