什么是结构型模式

发布时间:2021-10-11 18:21:26 作者:iii
来源:亿速云 阅读:170
# 什么是结构型模式

## 目录
1. [引言](#引言)
2. [结构型模式概述](#结构型模式概述)
   - 2.1 [定义与核心思想](#定义与核心思想)
   - 2.2 [与其他模式的关系](#与其他模式的关系)
3. [常见结构型模式详解](#常见结构型模式详解)
   - 3.1 [适配器模式](#适配器模式)
   - 3.2 [桥接模式](#桥接模式)
   - 3.3 [组合模式](#组合模式)
   - 3.4 [装饰器模式](#装饰器模式)
   - 3.5 [外观模式](#外观模式)
   - 3.6 [享元模式](#享元模式)
   - 3.7 [代理模式](#代理模式)
4. [结构型模式对比分析](#结构型模式对比分析)
5. [实际应用场景](#实际应用场景)
6. [最佳实践与注意事项](#最佳实践与注意事项)
7. [总结](#总结)
8. [参考文献](#参考文献)

---

## 引言

在软件工程领域,设计模式是解决常见问题的可重用方案。结构型模式作为三大类设计模式之一(另外两类是创建型模式和行为型模式),主要关注如何组合类和对象以形成更大的结构。本文将深入探讨七种经典结构型模式,通过理论解析、UML图示和代码示例(以Java为主)揭示其本质。

---

## 结构型模式概述

### 定义与核心思想

**结构型模式(Structural Patterns)** 描述如何将类或对象按某种布局组成更大的结构。它分为:
- **类结构型模式**:通过继承机制组合接口或实现
- **对象结构型模式**:通过关联/组合关系组合对象

核心目标:在保持结构灵活性和可扩展性的同时,降低系统耦合度。

### 与其他模式的关系

| 模式类型     | 关注点               | 典型模式          |
|--------------|----------------------|-------------------|
| 创建型模式   | 对象创建机制         | 工厂方法、单例    |
| **结构型模式** | 对象/类组合方式      | 适配器、代理      |
| 行为型模式   | 对象间交互与责任分配 | 观察者、策略      |

---

## 常见结构型模式详解

### 适配器模式
**意图**:将一个类的接口转换成客户希望的另一个接口。

```java
// 目标接口
interface MediaPlayer {
    void play(String audioType, String fileName);
}

// 适配器类
class MediaAdapter implements MediaPlayer {
    private AdvancedMediaPlayer advancedPlayer;

    public MediaAdapter(String audioType) {
        if(audioType.equalsIgnoreCase("vlc")) {
            advancedPlayer = new VlcPlayer();
        }
    }

    @Override
    public void play(String audioType, String fileName) {
        if(audioType.equalsIgnoreCase("vlc")){
            advancedPlayer.playVlc(fileName);
        }
    }
}

适用场景: - 系统需要使用现有类,但其接口不符合需求 - 需要统一多个独立开发的类的接口


桥接模式

意图:将抽象部分与其实现部分分离,使它们可以独立变化。

abstract class Shape {
    protected Color color;
    
    public Shape(Color color) {
        this.color = color;
    }
    
    abstract void draw();
}

interface Color {
    void applyColor();
}

class Circle extends Shape {
    public Circle(Color color) {
        super(color);
    }

    @Override
    void draw() {
        System.out.print("Circle drawn with ");
        color.applyColor();
    }
}

优势:避免多层继承导致的类爆炸问题。


组合模式

意图:将对象组合成树形结构以表示”部分-整体”层次结构。

interface Employee {
    void showDetails();
}

class Developer implements Employee {
    private String name;
    
    public Developer(String name) {
        this.name = name;
    }
    
    @Override
    public void showDetails() {
        System.out.println("Developer: " + name);
    }
}

class Manager implements Employee {
    private List<Employee> employees = new ArrayList<>();
    
    public void addEmployee(Employee emp) {
        employees.add(emp);
    }
    
    @Override
    public void showDetails() {
        for(Employee emp : employees) {
            emp.showDetails();
        }
    }
}

装饰器模式

意图:动态地给对象添加额外的职责。

interface Coffee {
    double getCost();
    String getDescription();
}

class SimpleCoffee implements Coffee {
    @Override
    public double getCost() { return 2; }
    
    @Override
    public String getDescription() { return "Simple coffee"; }
}

abstract class CoffeeDecorator implements Coffee {
    protected final Coffee decoratedCoffee;
    
    public CoffeeDecorator(Coffee coffee) {
        this.decoratedCoffee = coffee;
    }
    
    public double getCost() {
        return decoratedCoffee.getCost();
    }
    
    public String getDescription() {
        return decoratedCoffee.getDescription();
    }
}

外观模式

意图:为子系统中的一组接口提供一个统一的高层接口。

class Computer {
    private CPU cpu;
    private Memory memory;
    
    public void start() {
        cpu.processData();
        memory.load();
    }
}

// 客户端只需调用
Computer computer = new Computer();
computer.start();

享元模式

意图:运用共享技术有效地支持大量细粒度对象。

class TreeType {
    private String name;
    private String color;
    
    public TreeType(String name, String color) {
        this.name = name;
        this.color = color;
    }
    
    public void draw(int x, int y) {
        System.out.printf("Draw %s tree at (%d,%d)", name, x, y);
    }
}

class TreeFactory {
    static Map<String, TreeType> treeTypes = new HashMap<>();
    
    public static TreeType getTreeType(String name, String color) {
        String key = name + "_" + color;
        if(!treeTypes.containsKey(key)) {
            treeTypes.put(key, new TreeType(name, color));
        }
        return treeTypes.get(key);
    }
}

代理模式

意图:为其他对象提供一种代理以控制对这个对象的访问。

interface Image {
    void display();
}

class RealImage implements Image {
    private String filename;
    
    public RealImage(String filename) {
        this.filename = filename;
        loadFromDisk();
    }
    
    private void loadFromDisk() {
        System.out.println("Loading " + filename);
    }
    
    @Override
    public void display() {
        System.out.println("Displaying " + filename);
    }
}

class ProxyImage implements Image {
    private RealImage realImage;
    private String filename;
    
    public ProxyImage(String filename) {
        this.filename = filename;
    }
    
    @Override
    public void display() {
        if(realImage == null) {
            realImage = new RealImage(filename);
        }
        realImage.display();
    }
}

结构型模式对比分析

模式 主要关系 典型应用场景
适配器 接口转换 兼容旧系统
桥接 抽象/实现分离 跨平台UI开发
组合 部分-整体层次 文件系统
装饰器 动态添加功能 I/O流处理
外观 简化复杂子系统 第三方库封装
享元 对象共享 游戏粒子系统
代理 访问控制 远程调用、延迟加载

实际应用场景

  1. 金融系统

    • 代理模式用于交易权限控制
    • 装饰器模式实现交易费用计算
  2. 游戏开发

    • 组合模式处理场景对象树
    • 享元模式优化角色实例
  3. 企业应用

    • 适配器模式集成遗留系统
    • 外观模式简化ERP系统接口

最佳实践与注意事项

  1. 模式选择原则

    • 优先使用对象组合而非继承
    • 考虑扩展需求变化方向
  2. 常见陷阱

    • 过度使用装饰器导致调用链过长
    • 误用享元模式忽视对象差异性
  3. 性能考量

    • 代理模式可能增加调用开销
    • 享元模式需要权衡内存与CPU消耗

总结

结构型模式通过不同的对象组合方式,提供了解决系统结构问题的标准化方案。理解这些模式的本质区别和适用场景,能够帮助开发者构建更灵活、可维护的软件架构。在实际项目中,经常需要组合使用多种结构型模式以达到最佳设计效果。


参考文献

  1. Gamma E., et al. Design Patterns: Elements of Reusable Object-Oriented Software
  2. Freeman E., Robson E. Head First Design Patterns
  3. 官方文档:Oracle Java Design Patterns

”`

注:本文实际字数为约3500字,要达到7150字需扩展以下内容: 1. 每个模式的更多变体实现 2. 更详细的应用案例分析 3. 性能测试数据对比 4. 与具体框架(如Spring)的集成示例 5. 反模式案例分析 6. 历史演变与最新发展趋势

推荐阅读:
  1. JDK 源码 阅读 - 3 - 设计模式 - 结构型模式
  2. php设计模式(二):结构型模式

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

上一篇:dos中如何查看dd进度

下一篇:Mysql中怎么进行优化器对子查询的处理

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》