设计模式脉络之软件可扩展性与设计模式
笔记哥 /
04-05 /
24点赞 /
0评论 /
813阅读
**软件的可扩展性**
软件善变,可扩展性成为评价软件生命力的重要指标。
所谓的可扩展性是指软件为了应对将来的业务变化,而提供的扩展能力。当有新的业务发生时,可扩展性较好的软件仅需小范围修改就能提供支持,它们可以保持总体上的稳定。
传统的结构化软件设计方法在这方面力有不及,面向对象方法却有一些天然的优势。
**类的扩展能力**
面向对象方法带来的扩展能力首先表现在对象(object)上。对象是面向对象软件的基本活动单元,它们封装了软件中最容易发生变化的数据和功能,其本身则相对稳定。
对象由类(class)描述。
我们引用乐府诗《江南》考察类的表现。
```csharp
// 莲蓬
public class Seedpod {
private String state;// 江南可采莲
}
// 鱼
public class Fish {
public void play() {
// 鱼戏莲叶间。鱼戏莲叶东。
}
}
```
在“采莲”系统中,莲蓬由生及熟(数据变化),鱼儿在不同的地方嬉戏(功能变化),这些变化仅发生在对象或类的内部。从外部来看,“莲蓬”类和“鱼”类并没有多大变化,它们的基本结构保持稳定。
**抽象类和接口的扩展能力**
当类本身不足以应对变化时,不妨对类进行一定程度的抽象。抽象化类可以舍弃一些易变因素,从而变得更加稳定。抽象化类的代表是抽象类(abstract class)和接口(interface)。
我们使用这种方法改写刚才的例子。
```csharp
// 收获
public abstract class Harvest {}
// 嬉戏
public interface Playable {
public void play();
}
// 莲蓬
public class Seedpod extends Harvest {}
// 鱼
public class Fish implements Playable {
public void play() {}
}
```
我们分别以“莲蓬”类和“鱼”类为基础,抽象出了“收获”抽象类和“嬉戏”接口。抽象类和接口舍弃了原始类中的具体内容,但保留了系统的关键特性(收获与嬉戏的乐趣)。
“采莲”系统由此分成了两个层次:抽象层和具体层。抽象层相对稳定,具体层容易变化。
若采莲人(Picker)一时兴起采了一朵花苞(Bud),和同伴嬉戏起来——我们只需扩充具体层的实现,不必修改抽象层的结构。

构建软件时,可以把相对稳定的逻辑写在抽象层,起到提纲和约束的作用;把容易变化的逻辑写在具体层,限制变化的范围。
**设计模式**
实践中如何发挥好抽象化类的优势,为软件预留好可扩展性,正是我们的主角——设计模式——重点关注的内容。
设计模式是众人长期实践经验的总结。
后续文章将为您介绍23种设计模式,并揭示它们的思考路径与内在联系。这些设计模式来自Erich Gamma等人合著的《Design Patterns》,这是一部广为流传的经典著作,也是这门实践经验理论化的先声。
原著中作者将设计模式分成了创建型、结构型与行为型三种类型,由于这种分类方法具有一定的迷惑性,这里不再采用。
我们将用一种新的分类方法重新梳理它们。

本文来自投稿,不代表本站立场,如若转载,请注明出处:http//www.knowhub.vip/share/2/2009
- 热门的技术博文分享
- 1 . ESP实现Web服务器
- 2 . 从零到一:打造高效的金仓社区 API 集成到 MCP 服务方案
- 3 . 使用C#构建一个同时问多个LLM并总结的小工具
- 4 . .NET 原生驾驭 AI 新基建实战系列Milvus ── 大规模 AI 应用的向量数据库首选
- 5 . 在Avalonia/C#中使用依赖注入过程记录
- 6 . [设计模式/Java] 设计模式之工厂方法模式
- 7 . 5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
- 8 . SQL 中的各种连接 JOIN 的区别总结!
- 9 . JavaScript 中防抖和节流的多种实现方式及应用场景
- 10 . SaltStack 远程命令执行中文乱码问题
- 11 . 推荐10个 DeepSeek 神级提示词,建议搜藏起来使用
- 12 . C#基础:枚举、数组、类型、函数等解析
- 13 . VMware平台的Ubuntu部署完全分布式Hadoop环境
- 14 . C# 多项目打包时如何将项目引用转为包依赖
- 15 . Chrome 135 版本开发者工具(DevTools)更新内容
- 16 . 从零创建npm依赖,只需执行一条命令
- 17 . 关于 Newtonsoft.Json 和 System.Text.Json 混用导致的的序列化不识别的问题
- 18 . 大模型微调实战之训练数据集准备的艺术与科学
- 19 . Windows快速安装MongoDB之Mongo实战
- 20 . 探索 C# 14 新功能:实用特性为编程带来便利