架构模式简介
架构模式规范系统设计,分离关注点,优化性能与扩展,提升开发效率和维护性,适用多种软件类型。
架构模式简介
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());