设计模式不是语法规则,而是解决特定问题的经验结晶,是连接"业务需求"与"代码实现"之间的艺术桥梁。
文章目录
-
- [🌟 引言:一个真实的项目困境](#🌟 引言:一个真实的项目困境)
- 一、设计模式到底是什么?🤔
-
- [1.1 官方定义](#1.1 官方定义)
- [1.2 形象的比喻](#1.2 形象的比喻)
- [1.3 常见误解澄清](#1.3 常见误解澄清)
- 二、为什么需要设计模式?🎯
-
- [2.1 软件开发的核心挑战](#2.1 软件开发的核心挑战)
- [2.2 设计模式的三大核心作用](#2.2 设计模式的三大核心作用)
-
- [作用一:**提高代码的可重用性** ♻️](#作用一:提高代码的可重用性 ♻️)
- [作用二:**提高代码的可维护性** 🔧](#作用二:提高代码的可维护性 🔧)
- [作用三:**提高系统的灵活性和可扩展性** 🚀](#作用三:提高系统的灵活性和可扩展性 🚀)
- [三、设计模式的分类体系 🗂️](#三、设计模式的分类体系 🗂️)
-
- [3.1 创建型模式(5种)](#3.1 创建型模式(5种))
- [3.2 结构型模式(7种)](#3.2 结构型模式(7种))
- [3.3 行为型模式(11种)](#3.3 行为型模式(11种))
- [四、设计模式在实际项目中的应用 📊](#四、设计模式在实际项目中的应用 📊)
-
- [4.1 何时使用设计模式?](#4.1 何时使用设计模式?)
- [4.2 经典框架中的设计模式应用](#4.2 经典框架中的设计模式应用)
- [4.3 实际项目案例:电商系统](#4.3 实际项目案例:电商系统)
- [五、设计模式的局限性 🚨](#五、设计模式的局限性 🚨)
-
- [5.1 不要滥用设计模式](#5.1 不要滥用设计模式)
- [5.2 设计模式的使用原则](#5.2 设计模式的使用原则)
- [六、如何学习和应用设计模式 🎓](#六、如何学习和应用设计模式 🎓)
-
- [6.1 学习路径建议](#6.1 学习路径建议)
- [6.2 实践练习方法](#6.2 实践练习方法)
- [6.3 经典学习资源](#6.3 经典学习资源)
- [七、总结与展望 📚](#七、总结与展望 📚)
-
- [7.1 核心要点回顾](#7.1 核心要点回顾)
- [7.2 设计原则 > 设计模式](#7.2 设计原则 > 设计模式)
- [7.3 未来发展趋势](#7.3 未来发展趋势)
- [参考资料 📖](#参考资料 📖)
🌟 引言:一个真实的项目困境
想象一下这个场景:你接手了一个电商订单系统的维护工作。某天产品经理提出一个新需求------需要为不同类型的用户(普通用户、VIP用户、内部员工)提供差异化的折扣计算方式。
初级程序员的写法:
java
// 充满if-else的"面条式代码"
public double calculateDiscount(String userType, double amount) {
if ("NORMAL".equals(userType)) {
return amount * 0.95; // 普通用户95折
} else if ("VIP".equals(userType)) {
return amount * 0.85; // VIP用户85折
} else if ("EMPLOYEE".equals(userType)) {
return amount * 0.70; // 内部员工7折
} else if ("PARTNER".equals(userType)) {
return amount * 0.80; // 合作伙伴8折
}
// 每加一种用户类型,就要加一个if分支
throw new IllegalArgumentException("未知用户类型");
}
使用设计模式后的写法:
java
// 使用策略模式,清晰、可扩展
public interface DiscountStrategy {
double calculate(double amount);
}
public class NormalUserDiscount implements DiscountStrategy {
@Override
public double calculate(double amount) {
return amount * 0.95;
}
}
public class VipUserDiscount implements DiscountStrategy {
@Override
public double calculate(double amount) {
return amount * 0.85;
}
}
// 使用时
public class DiscountContext {
private DiscountStrategy strategy;
public void setStrategy(DiscountStrategy strategy) {
this.strategy = strategy;
}
public double executeStrategy(double amount) {
return strategy.calculate(amount);
}
}
对比分析:
- 前者:每增加一种用户类型就要修改核心方法,违反开闭原则
- 后者:新增用户类型只需新增策略类,核心代码无需修改
这个简单的例子揭示了设计模式的核心价值:用可复用的解决方案应对变化的需求。
一、设计模式到底是什么?🤔
1.1 官方定义
设计模式 (Design Pattern)是在特定环境下,对软件设计中反复出现的通用问题的可重用解决方案。
1994年,四位软件工程师(Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides,合称"GoF")出版了《设计模式:可复用面向对象软件的基础》一书,系统性地提出了23种经典设计模式,开创了设计模式研究的先河。
1.2 形象的比喻
为了更好地理解,让我们看看设计模式在不同领域的类比:
| 领域 | 类比 | 说明 |
|---|---|---|
| 建筑学 | 建筑模式 | 解决"如何设计一个采光良好的客厅"这类重复性问题 |
| 武术 | 武功招式 | 面对不同攻击时的标准应对方法 |
| 烹饪 | 菜谱配方 | 制作特定菜肴的标准步骤 |
| 软件工程 | 设计模式 | 解决"如何让对象创建更灵活"这类编码问题 |
核心理解 :设计模式不是具体的代码,而是解决问题的思路和模板。就像武术招式不是固定的动作,而是根据对手动作做出的反应套路。
1.3 常见误解澄清
| 误解 | 真相 | 示例 |
|---|---|---|
| "设计模式是高级语法" | 设计模式使用基础语法实现 | 单例模式只用了static、private等基础概念 |
| "用了设计模式代码就更优秀" | 滥用模式比不用更糟糕 | 在简单场景用复杂模式是过度设计 |
| "模式必须严格照搬" | 模式是指导,可根据场景调整 | 根据需求调整观察者模式的实现方式 |
| "模式只用于面向对象" | 函数式编程也有模式 | 函数式编程中的Monad、Functor等模式 |
二、为什么需要设计模式?🎯
2.1 软件开发的核心挑战
在深入了解设计模式的作用前,先看看没有设计模式的代码会面临什么问题:
java
// 问题示例:紧耦合的订单处理系统
public class OrderService {
private EmailNotifier emailNotifier = new EmailNotifier();
private InventoryService inventory = new InventoryService();
private PaymentProcessor payment = new PaymentProcessor();
public void processOrder(Order order) {
// 1. 验证库存
boolean inStock = inventory.checkStock(order);
// 2. 处理支付
boolean paymentSuccess = payment.process(order);
// 3. 发送通知
if (paymentSuccess) {
emailNotifier.sendEmail(order.getUser(), "订单支付成功");
}
// 问题:所有组件紧密耦合,难以测试和修改
}
}
这种代码的六大痛点:
- 难以修改:改一处可能影响多处
- 难以测试:组件依赖导致无法单元测试
- 难以重用:逻辑绑死在特定类中
- 难以理解:职责不清,代码像"意大利面条"
- 难以扩展:添加新功能要修改现有代码
- 难以维护:bug像打地鼠,解决一个冒出另一个
2.2 设计模式的三大核心作用
作用一:提高代码的可重用性 ♻️
设计模式提供了经过验证的解决方案,避免重复造轮子:
java
// 不使用模式:多个地方都需要对象池
public class ConnectionManager1 {
private List<Connection> pool = new ArrayList<>();
// 自己实现对象池逻辑...
}
public class ThreadManager1 {
private List<Thread> pool = new ArrayList<>();
// 又实现一遍对象池逻辑...
}
// 使用享元模式:一次实现,多处使用
public abstract class ObjectPool<T> {
private List<T> available = new ArrayList<>();
private List<T> inUse = new ArrayList<>();
protected abstract T create();
public synchronized T acquire() {
if (available.isEmpty()) {
available.add(create());
}
T obj = available.remove(0);
inUse.add(obj);
return obj;
}
public synchronized void release(T obj) {
inUse.remove(obj);
available.add(obj);
}
}
// 具体实现
public class ConnectionPool extends ObjectPool<Connection> {
@Override
protected Connection create() {
return new Connection();
}
}
public class ThreadPool extends ObjectPool<Thread> {
@Override
protected Thread create() {
return new WorkerThread();
}
}
可重用性价值:
- ✅ 减少重复代码:相同问题不用重复解决
- ✅ 提高开发效率:站在巨人肩膀上
- ✅ 保证代码质量:使用经过验证的方案
作用二:提高代码的可维护性 🔧
设计模式通过清晰的架构,让代码更容易理解和修改:

java
// 维护性差的代码:创建逻辑分散在各处
public class ClientCode {
public void doSomething() {
// 创建A产品的逻辑
Product productA = new ConcreteProductA("配置1", "配置2");
// 创建B产品的逻辑(在另一处)
Product productB = new ConcreteProductB(100, "红色");
}
}
// 使用工厂模式后:创建逻辑集中管理
public interface ProductFactory {
Product createProduct();
}
public class ProductAFactory implements ProductFactory {
@Override
public Product createProduct() {
// 所有A产品的创建逻辑集中在此
return new ConcreteProductA("标准配置1", "标准配置2");
}
}
public class ProductBFactory implements ProductFactory {
@Override
public Product createProduct() {
// 所有B产品的创建逻辑集中在此
return new ConcreteProductB(100, "默认红色");
}
}
// 客户端代码变得简洁且易于维护
public class ClientCode {
private ProductFactory factory;
public ClientCode(ProductFactory factory) {
this.factory = factory; // 依赖注入,便于测试和维护
}
public void doSomething() {
Product product = factory.createProduct(); // 创建逻辑被封装
product.use();
}
}
可维护性价值:
- ✅ 降低理解成本:模式有标准名称和结构
- ✅ 便于团队协作:共用"设计词汇表"
- ✅ 减少修改风险:遵循开闭原则
作用三:提高系统的灵活性和可扩展性 🚀
设计模式让系统更容易应对变化:
java
// 场景:电商促销活动系统
// 初始需求:只有满减活动
public class PromotionService {
public double applyDiscount(double amount, String activityType) {
if ("FULL_REDUCTION".equals(activityType)) {
// 满减逻辑
if (amount >= 100) {
return amount - 20;
}
}
return amount;
}
}
// 新需求:要添加折扣、赠品、优惠券...
// 不使用模式:代码会变成这样
public double applyDiscount(double amount, String activityType) {
if ("FULL_REDUCTION".equals(activityType)) {
// 满减逻辑
} else if ("PERCENT_DISCOUNT".equals(activityType)) {
// 折扣逻辑
} else if ("GIFT".equals(activityType)) {
// 赠品逻辑
} else if ("COUPON".equals(activityType)) {
// 优惠券逻辑
}
// 每增加一种活动,就要修改这个方法
}
// 使用策略模式:轻松扩展
public interface PromotionStrategy {
double applyPromotion(double amount);
}
public class FullReductionStrategy implements PromotionStrategy {
@Override
public double applyPromotion(double amount) {
return amount >= 100 ? amount - 20 : amount;
}
}
public class PercentDiscountStrategy implements PromotionStrategy {
private double discountRate; // 8折就是0.8
public PercentDiscountStrategy(double discountRate) {
this.discountRate = discountRate;
}
@Override
public double applyPromotion(double amount) {
return amount * discountRate;
}
}
// 新增活动类型只需新增策略类,不修改已有代码
public class GiftStrategy implements PromotionStrategy {
@Override
public double applyPromotion(double amount) {
// 赠品逻辑
System.out.println("赠送精美礼品一份");
return amount; // 价格不变
}
}
// 促销上下文,灵活切换策略
public class PromotionContext {
private PromotionStrategy strategy;
public void setStrategy(PromotionStrategy strategy) {
this.strategy = strategy;
}
public double executeStrategy(double amount) {
return strategy.applyPromotion(amount);
}
}
灵活性价值:
- ✅ 应对需求变化:新增功能不修改旧代码
- ✅ 支持配置化:通过配置决定使用哪种模式
- ✅ 便于A/B测试:轻松切换不同实现
三、设计模式的分类体系 🗂️
GoF的23种设计模式按照目的分为三大类,这是理解设计模式的基础框架:
3.1 创建型模式(5种)
核心问题 :如何创建对象?
创建型模式将对象的创建与使用分离,使系统不依赖具体对象的创建细节。
| 模式名称 | 别名 | 要解决的问题 | 生活类比 |
|---|---|---|---|
| 单例模式 | Singleton | 一个类只能有一个实例 | 公司CEO(只有一个) |
| 工厂方法 | Factory Method | 不指定具体类创建对象 | 招聘网站(根据需求推荐人才) |
| 抽象工厂 | Abstract Factory | 创建相关对象家族 | 家具商城(配套的桌椅床) |
| 建造者模式 | Builder | 创建复杂对象 | 组装电脑(选择不同配件) |
| 原型模式 | Prototype | 通过复制创建对象 | 复印机(复制原件) |
java
// 创建型模式示例:工厂方法
public interface Document {
void open();
void save();
}
public class WordDocument implements Document {
@Override
public void open() { System.out.println("打开Word文档"); }
@Override
public void save() { System.out.println("保存Word文档"); }
}
public class ExcelDocument implements Document {
@Override
public void open() { System.out.println("打开Excel文档"); }
@Override
public void save() { System.out.println("保存Excel文档"); }
}
// 工厂接口
public interface DocumentFactory {
Document createDocument();
}
// 具体工厂
public class WordFactory implements DocumentFactory {
@Override
public Document createDocument() {
return new WordDocument();
}
}
public class ExcelFactory implements DocumentFactory {
@Override
public Document createDocument() {
return new ExcelDocument();
}
}
// 使用
public class Application {
private DocumentFactory factory;
public Application(DocumentFactory factory) {
this.factory = factory;
}
public void createAndUseDocument() {
Document doc = factory.createDocument(); // 不关心具体类型
doc.open();
doc.save();
}
}
3.2 结构型模式(7种)
核心问题 :如何组合类和对象?
结构型模式关注类和对象的组合,形成更大的结构。
| 模式名称 | 别名 | 要解决的问题 | 生活类比 |
|---|---|---|---|
| 适配器模式 | Adapter/Wrapper | 接口不兼容 | 电源转换插头 |
| 桥接模式 | Bridge | 抽象与实现分离 | 遥控器与电视品牌 |
| 组合模式 | Composite | 部分-整体层次结构 | 文件系统(文件/文件夹) |
| 装饰器模式 | Decorator | 动态添加功能 | 给手机加手机壳、贴膜 |
| 外观模式 | Facade | 简化复杂子系统接口 | 客服总机(一个电话解决所有问题) |
| 享元模式 | Flyweight | 高效共享大量细粒度对象 | 字符重复使用(如文档中的字母) |
| 代理模式 | Proxy | 控制对象访问 | 明星经纪人 |
java
// 结构型模式示例:装饰器模式
public interface Coffee {
double getCost();
String getDescription();
}
// 基础组件
public class SimpleCoffee implements Coffee {
@Override
public double getCost() { return 5.0; }
@Override
public String getDescription() { return "普通咖啡"; }
}
// 装饰器基类
public abstract class CoffeeDecorator implements Coffee {
protected Coffee decoratedCoffee;
public CoffeeDecorator(Coffee coffee) {
this.decoratedCoffee = coffee;
}
@Override
public double getCost() {
return decoratedCoffee.getCost();
}
@Override
public String getDescription() {
return decoratedCoffee.getDescription();
}
}
// 具体装饰器
public class MilkDecorator extends CoffeeDecorator {
public MilkDecorator(Coffee coffee) {
super(coffee);
}
@Override
public double getCost() {
return super.getCost() + 2.0;
}
@Override
public String getDescription() {
return super.getDescription() + ",加牛奶";
}
}
public class SugarDecorator extends CoffeeDecorator {
public SugarDecorator(Coffee coffee) {
super(coffee);
}
@Override
public double getCost() {
return super.getCost() + 1.0;
}
@Override
public String getDescription() {
return super.getDescription() + ",加糖";
}
}
// 使用:动态组合功能
public class CoffeeShop {
public static void main(String[] args) {
Coffee coffee = new SimpleCoffee();
System.out.println(coffee.getDescription() + " ¥" + coffee.getCost());
// 动态添加牛奶
coffee = new MilkDecorator(coffee);
System.out.println(coffee.getDescription() + " ¥" + coffee.getCost());
// 动态添加糖
coffee = new SugarDecorator(coffee);
System.out.println(coffee.getDescription() + " ¥" + coffee.getCost());
// 输出:
// 普通咖啡 ¥5.0
// 普通咖啡,加牛奶 ¥7.0
// 普通咖啡,加牛奶,加糖 ¥8.0
}
}
3.3 行为型模式(11种)
核心问题 :对象之间如何交互和分配职责?
行为型模式关注对象间的通信和职责分配。
| 模式名称 | 别名 | 要解决的问题 | 生活类比 |
|---|---|---|---|
| 责任链 | Chain of Responsibility | 请求的发送与接收解耦 | 行政审批流程 |
| 命令模式 | Command | 将请求封装为对象 | 餐厅点餐(订单单据) |
| 解释器模式 | Interpreter | 定义语言的文法表示 | 编译器解释代码 |
| 迭代器模式 | Iterator | 顺序访问集合元素 | 遥控器换台 |
| 中介者模式 | Mediator | 对象间交互集中管理 | 机场控制塔 |
| 备忘录模式 | Memento | 保存和恢复对象状态 | 游戏存档 |
| 观察者模式 | Observer/Publish-Subscribe | 对象间一对多依赖 | 微信公众号订阅 |
| 状态模式 | State | 对象状态改变时行为改变 | 红绿灯状态切换 |
| 策略模式 | Strategy | 算法族封装,可互换 | 出行方式选择(公交/打车/骑车) |
| 模板方法 | Template Method | 定义算法骨架,步骤延迟到子类 | 冲泡饮料流程 |
| 访问者模式 | Visitor | 在不修改类的情况下添加操作 | 税务审计员检查不同公司 |
java
// 行为型模式示例:观察者模式(发布-订阅)
import java.util.*;
// 观察者接口
public interface Observer {
void update(String message);
}
// 主题接口
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
// 具体主题:微信公众号
public class WeChatPublicAccount implements Subject {
private List<Observer> observers = new ArrayList<>();
private String accountName;
private String latestArticle;
public WeChatPublicAccount(String name) {
this.accountName = name;
}
// 发布新文章
public void publishArticle(String articleTitle) {
this.latestArticle = articleTitle;
System.out.println(accountName + " 发布了新文章: " + articleTitle);
notifyObservers();
}
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(latestArticle);
}
}
}
// 具体观察者:用户
public class User implements Observer {
private String userName;
public User(String name) {
this.userName = name;
}
@Override
public void update(String message) {
System.out.println("【" + userName + "】收到通知: " + message);
}
}
// 使用
public class ObserverPatternDemo {
public static void main(String[] args) {
// 创建公众号
WeChatPublicAccount account = new WeChatPublicAccount("技术那些事儿");
// 创建用户(观察者)
User user1 = new User("张三");
User user2 = new User("李四");
User user3 = new User("王五");
// 用户订阅公众号
account.registerObserver(user1);
account.registerObserver(user2);
account.registerObserver(user3);
// 公众号发布文章,所有订阅者自动收到通知
account.publishArticle("设计模式实战指南");
// 输出:
// 技术那些事儿 发布了新文章: 设计模式实战指南
// 【张三】收到通知: 设计模式实战指南
// 【李四】收到通知: 设计模式实战指南
// 【王五】收到通知: 设计模式实战指南
}
}
四、设计模式在实际项目中的应用 📊
4.1 何时使用设计模式?
设计模式不是银弹,正确使用时机的判断标准:

4.2 经典框架中的设计模式应用
几乎所有主流框架都大量使用了设计模式:
| 框架/库 | 使用的设计模式 | 应用场景 | 作用 |
|---|---|---|---|
| Spring Framework | 工厂模式 | BeanFactory | 管理对象的创建 |
| 单例模式 | 默认Bean作用域 | 节省资源,共享实例 | |
| 代理模式 | AOP实现 | 动态增强功能 | |
| 模板方法 | JdbcTemplate | 固定流程,可变步骤 | |
| Java JDK | 观察者模式 | java.util.Observer | 事件监听机制 |
| 装饰器模式 | java.io包 | 流的功能扩展 | |
| 迭代器模式 | java.util.Iterator | 集合遍历 | |
| 适配器模式 | Arrays.asList() | 数组转列表 | |
| MyBatis | 建造者模式 | SqlSessionFactoryBuilder | 构建复杂对象 |
| 工厂模式 | SqlSessionFactory | 创建SqlSession | |
| 代理模式 | Mapper接口实现 | 接口方法映射SQL |
4.3 实际项目案例:电商系统
让我们看一个电商系统中设计模式的实际应用:
java
// 电商系统设计模式应用示例
public class ECommerceSystem {
// 1. 订单创建:使用工厂模式
public interface OrderFactory {
Order createOrder(Customer customer, List<Product> products);
}
public class NormalOrderFactory implements OrderFactory {
@Override
public Order createOrder(Customer customer, List<Product> products) {
return new Order(customer, products, new Date());
}
}
public class FlashSaleOrderFactory implements OrderFactory {
@Override
public Order createOrder(Customer customer, List<Product> products) {
Order order = new Order(customer, products, new Date());
order.setFlashSale(true);
order.setDiscount(0.5); // 秒杀5折
return order;
}
}
// 2. 支付处理:使用策略模式
public interface PaymentStrategy {
boolean pay(double amount);
}
public class AlipayStrategy implements PaymentStrategy {
@Override
public boolean pay(double amount) {
System.out.println("使用支付宝支付: " + amount + "元");
// 调用支付宝API
return true;
}
}
public class WechatPayStrategy implements PaymentStrategy {
@Override
public boolean pay(double amount) {
System.out.println("使用微信支付: " + amount + "元");
// 调用微信支付API
return true;
}
}
public class PaymentContext {
private PaymentStrategy strategy;
public void setPaymentStrategy(PaymentStrategy strategy) {
this.strategy = strategy;
}
public boolean executePayment(double amount) {
return strategy.pay(amount);
}
}
// 3. 库存管理:使用观察者模式
public interface StockObserver {
void update(Product product, int oldStock, int newStock);
}
public class StockWarningObserver implements StockObserver {
@Override
public void update(Product product, int oldStock, int newStock) {
if (newStock < 10) {
System.out.println("警告: 商品 " + product.getName() +
" 库存过低,仅剩 " + newStock + " 件");
// 发送通知给采购人员
}
}
}
public class PromoActivationObserver implements StockObserver {
@Override
public void update(Product product, int oldStock, int newStock) {
if (newStock > 100 && oldStock <= 100) {
System.out.println("商品 " + product.getName() +
" 库存充足,可启动促销活动");
}
}
}
// 4. 物流配送:使用责任链模式
public abstract class LogisticsHandler {
protected LogisticsHandler nextHandler;
public void setNextHandler(LogisticsHandler handler) {
this.nextHandler = handler;
}
public abstract boolean handle(Order order);
}
public class LocalDeliveryHandler extends LogisticsHandler {
@Override
public boolean handle(Order order) {
if (order.getDistance() < 10) { // 10公里内本地配送
System.out.println("本地配送处理订单: " + order.getId());
return true;
} else if (nextHandler != null) {
return nextHandler.handle(order);
}
return false;
}
}
public class ExpressDeliveryHandler extends LogisticsHandler {
@Override
public boolean handle(Order order) {
if (order.getDistance() < 1000) { // 1000公里内快递
System.out.println("快递处理订单: " + order.getId());
return true;
} else if (nextHandler != null) {
return nextHandler.handle(order);
}
return false;
}
}
public class InternationalShippingHandler extends LogisticsHandler {
@Override
public boolean handle(Order order) {
System.out.println("国际运输处理订单: " + order.getId());
return true; // 国际运输兜底
}
}
}
五、设计模式的局限性 🚨
5.1 不要滥用设计模式
设计模式虽好,但滥用比不用更糟糕:
java
// 反例:在简单场景滥用设计模式
public class OverEngineeringExample {
// 场景:只需要一个简单的配置读取
// 滥用:用了工厂+策略+装饰器模式
public interface ConfigReader {
String read(String key);
}
public abstract class ConfigReaderDecorator implements ConfigReader {
protected ConfigReader decoratedReader;
// ... 复杂的装饰器逻辑
}
public class FileConfigReaderFactory {
// ... 复杂的工厂逻辑
}
// 其实只需要:
public class SimpleConfig {
private Properties props = new Properties();
public SimpleConfig(String filePath) throws IOException {
props.load(new FileInputStream(filePath));
}
public String get(String key) {
return props.getProperty(key);
}
}
}
5.2 设计模式的使用原则
| 原则 | 说明 | 示例 |
|---|---|---|
| KISS原则 | Keep It Simple, Stupid(保持简单) | 简单if-else能解决就不用策略模式 |
| YAGNI原则 | You Ain't Gonna Need It(你不会需要它) | 不需要提前为可能的需求添加模式 |
| 适度原则 | 在复杂性和灵活性间平衡 | 根据团队水平和项目规模选择模式 |
| 演进原则 | 需要时再重构引入模式 | 开始时简单实现,需求复杂后重构 |
六、如何学习和应用设计模式 🎓
6.1 学习路径建议

6.2 实践练习方法
- 模式识别练习:阅读开源代码,识别其中的设计模式
- 场景模拟练习:给定业务场景,选择合适的设计模式
- 对比分析练习:同一问题用不同模式解决,对比优劣
- 重构练习:将过程式代码重构为模式化代码
6.3 经典学习资源
| 资源类型 | 推荐 | 特点 |
|---|---|---|
| 经典书籍 | 《设计模式:可复用面向对象软件的基础》 | GoF原著,设计模式圣经 |
| 《Head First设计模式》 | 图文并茂,适合入门 | |
| 《设计模式之禅》 | 结合中国开发者实际 | |
| 在线课程 | 极客时间《设计模式之美》 | 王争讲解,系统全面 |
| Coursera设计模式专项课程 | 英文,国际视角 | |
| 实践项目 | GitHub设计模式示例 | 大量开源代码参考 |
| 设计模式实战项目 | 将模式应用到实际场景 |
七、总结与展望 📚
7.1 核心要点回顾
通过本文的学习,我们掌握了设计模式的核心:
- 设计模式是什么 :解决软件设计中常见问题的可复用方案模板
- 三大核心作用 :提高可重用性 、可维护性 、灵活性
- 三大分类体系 :创建型 (如何创建)、结构型 (如何组合)、行为型(如何交互)
- 正确使用观念 :工具而非目标 ,适度而非滥用
7.2 设计原则 > 设计模式
比具体模式更重要的是背后的设计原则:
| 设计原则 | 核心思想 | 与模式的关系 |
|---|---|---|
| 开闭原则 | 对扩展开放,对修改关闭 | 所有模式的根本目标 |
| 单一职责 | 一个类只负责一个功能 | 高内聚的基础 |
| 依赖倒置 | 依赖抽象而非具体实现 | 工厂、策略等模式的基础 |
| 里氏替换 | 子类能替换父类 | 继承关系设计准则 |
| 接口隔离 | 客户端不应依赖不需要的接口 | 接口设计原则 |
7.3 未来发展趋势
随着技术发展,设计模式也在演进:
- 函数式编程模式:Monad、Functor、Applicative等函数式模式
- 响应式编程模式:观察者模式的现代化身,如Reactive Streams
- 云原生设计模式:针对微服务、云环境的模式,如Circuit Breaker、Bulkhead
- 领域驱动设计:DDD中的模式,如实体、值对象、聚合根
🎯 最后的建议 :设计模式不是学习的终点,而是起点。真正优秀的开发者不是死记硬背23种模式,而是理解其背后的设计思想,在合适的场景创造性地应用。记住,没有最好的设计模式,只有最适合的设计方案。
参考资料 📖
- GoF《设计模式:可复用面向对象软件的基础》 - 设计模式开山之作
- 设计模式 | 菜鸟教程 - 中文入门教程
- Design Patterns - 图文并茂的英文教程
- 深入设计模式 - GitHub上的模式实现
- Martin Fowler《企业应用架构模式》 - 企业级模式
🔍 学习建议:理论学习后,一定要动手实践。尝试在个人项目或重构现有代码时应用设计模式,从模仿开始,逐步理解其精髓。同时,多阅读优秀开源框架的源码,看看大师们如何巧妙运用设计模式。
标签 : 设计模式 软件设计 编程原则 代码重构 面向对象