文章

架构模式简介

架构模式规范系统设计,分离关注点,优化性能与扩展,提升开发效率和维护性,适用多种软件类型。

架构模式简介

架构模式简介

1. Layered Architecture(分层架构)

一、结构组成

  • 表现层(UI Layer):与用户交互,收集输入。
  • 业务逻辑层(Business Logic Layer):处理业务规则。
  • 数据访问层(Data Access Layer):负责数据库操作。
  • 数据库(Database):存储数据。

二、工作原理 每层只依赖下一层,层层调用。

三、优点 / 缺点

  • 优点:结构清晰、便于维护、适合团队协作。
  • 缺点:层次过多可能导致性能下降。

四、适用场景 企业系统、Web 应用、桌面软件。

五、示例代码(Java Spring Boot)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@RestController
public class ProductController {
    @Autowired
    private ProductService productService;

    @GetMapping("/products")
    public List<Product> getProducts() {
        return productService.getAllProducts();
    }
}

@Service
public class ProductService {
    @Autowired
    private ProductRepository productRepository;

    public List<Product> getAllProducts() {
        return productRepository.findAll();
    }
}

@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {}

2. Client-Server Architecture(客户端-服务器)

一、结构组成

  • 客户端(Client):界面与用户交互。
  • 服务器(Server):处理请求、访问数据库。

二、工作原理 客户端发请求,服务器响应。

三、优点 / 缺点

  • 优点:职责分明,集中管理。
  • 缺点:服务器是单点瓶颈。

四、适用场景 浏览器访问网页、客户端程序连接数据库等。

五、示例代码(C++,使用 Boost Asio)

1
2
3
4
5
6
7
8
9
10
11
12
13
// Server 伪代码
boost::asio::ip::tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 1234));
for (;;) {
    tcp::socket socket(io_context);
    acceptor.accept(socket);
    std::string msg = "Hello Client";
    boost::asio::write(socket, boost::asio::buffer(msg));
}

// Client 伪代码
boost::asio::ip::tcp::socket socket(io_context);
socket.connect(endpoint);
boost::asio::write(socket, boost::asio::buffer("Hello Server"));

3. Microservices Architecture(微服务架构)

一、结构组成 多个服务独立部署、独立数据库。

二、工作原理 服务之间通过 HTTP/消息队列通信。

三、优点 / 缺点

  • 优点:技术异构、独立部署、弹性扩展。
  • 缺点:调用复杂、数据一致性难。

四、适用场景 大型系统(如 Netflix、京东等)。

五、示例代码(Java Spring Boot 微服务调用)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Service A: User Service
@RestController
public class UserController {
    @GetMapping("/user/{id}")
    public User getUser(@PathVariable Long id) {
        return new User(id, "Alice");
    }
}

// Service B: Order Service 调用 User Service
@RestController
public class OrderController {
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/order/{id}")
    public String getOrder(@PathVariable Long id) {
        User user = restTemplate.getForObject("http://USER-SERVICE/user/1", User.class);
        return "Order for user: " + user.getName();
    }
}

4. Event-Driven Architecture(事件驱动架构)

一、结构组成 事件生产者、事件通道(消息队列)、事件消费者。

二、工作原理 系统通过事件通信,解耦异步处理。

三、优点 / 缺点

  • 优点:松耦合、易扩展。
  • 缺点:流程难追踪、调试复杂。

四、适用场景 日志收集、下单处理、实时通知等。

五、示例代码(Android,使用 EventBus)

1
2
3
4
5
6
7
8
// 发布事件
EventBus.getDefault().post(new OrderEvent(orderId));

// 订阅事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onOrderEvent(OrderEvent event) {
    Log.d("Event", "Order received: " + event.getOrderId());
}

5. MVC(Model-View-Controller)

一、结构组成

  • Model:数据模型和业务逻辑。
  • View:展示界面。
  • Controller:处理输入,协调 Model 和 View。

二、工作原理 输入由 Controller 处理,更新 Model,Model 变更反映到 View。

三、优点 / 缺点

  • 优点:清晰分离,支持多个视图。
  • 缺点:Controller 可能过重。

四、适用场景 Web 应用、桌面软件。

五、示例代码(Android)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Controller
public class LoginActivity extends AppCompatActivity {
    public void onLoginClick(View v) {
        String username = usernameEditText.getText().toString();
        if (UserModel.validate(username)) {
            welcomeTextView.setText("Welcome, " + username);
        }
    }
}

// Model
public class UserModel {
    public static boolean validate(String username) {
        return username != null && !username.isEmpty();
    }
}

6. MVP(Model-View-Presenter)

一、结构组成

  • Model:数据和逻辑。
  • View:仅用于显示,不含逻辑。
  • Presenter:处理逻辑并操作 View。

二、工作原理 View 与 Presenter 解耦,双向通信。

三、优点 / 缺点

  • 优点:易测试,适合复杂交互。
  • 缺点:Presenter 易臃肿。

四、适用场景 WinForms、早期 Android。

五、示例代码(Android)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// View 接口
public interface LoginView {
    void showLoginSuccess(String message);
}

// Presenter
public class LoginPresenter {
    private LoginView view;
    public LoginPresenter(LoginView view) { this.view = view; }

    public void login(String username) {
        if (!TextUtils.isEmpty(username)) {
            view.showLoginSuccess("Welcome, " + username);
        }
    }
}

7. MVVM(Model-View-ViewModel)

一、结构组成

  • Model:核心数据。
  • ViewModel:公开属性和命令,供 View 绑定。
  • View:数据绑定展示。

二、工作原理 View 和 ViewModel 双向绑定。

三、优点 / 缺点

  • 优点:清晰分离,易测试。
  • 缺点:数据绑定调试难。

四、适用场景 WPF、Vue、Jetpack Compose、React Hooks。

五、示例代码(Android Jetpack ViewModel + DataBinding)

1
2
3
4
5
6
7
public class UserViewModel extends ViewModel {
    public MutableLiveData<String> userName = new MutableLiveData<>();

    public void greet() {
        userName.setValue("Hello, " + userName.getValue());
    }
}

8. Domain-Driven Design(领域驱动设计,DDD)

一、结构组成 实体、值对象、聚合、仓储、领域服务。

二、工作原理 以业务建模为中心,抽象领域行为。

三、优点 / 缺点

  • 优点:贴近业务、维护一致性。
  • 缺点:复杂、学习成本高。

四、适用场景 银行、电商、保险等复杂系统。

五、示例代码(Java)

1
2
3
4
5
6
7
public class Account {
    private List<Transaction> transactions = new ArrayList<>();

    public void deposit(BigDecimal amount) {
        transactions.add(new Transaction("deposit", amount));
    }
}

9. Serverless Architecture(无服务器架构)

一、结构组成 事件触发函数(如 AWS Lambda)。

二、工作原理 自动部署和扩展,按调用计费。

三、优点 / 缺点

  • 优点:无运维,按量付费。
  • 缺点:冷启动、平台依赖。

四、适用场景 原型开发、轻量服务、自动化脚本。

五、示例代码(AWS Lambda,Python)

1
2
def lambda_handler(event, context):
    return {"statusCode": 200, "body": "Hello from Lambda!"}

10. Pipeline-Filter Architecture(管道-过滤器架构)

一、结构组成 一系列过滤器通过管道依次处理数据。

二、工作原理 数据在各过滤器间流动,每层加工数据。

三、优点 / 缺点

  • 优点:解耦,易扩展和调试。
  • 缺点:中间状态传输多。

四、适用场景 编译器、数据处理、日志过滤。

五、示例代码(Java Stream API)

1
2
3
4
5
List<String> result = input.stream()
    .filter(s -> s.startsWith("A"))
    .map(String::toUpperCase)
    .distinct()
    .collect(Collectors.toList());
本文由作者按照 CC BY 4.0 进行授权