设计模式-15中介者模式Mediator Pattern

Linux下用SquareLine Studio开发LVGL界面:从安装到实战的完整避坑指南 本文提供了一份在Linux系统下使用SquareLine Studio开发LVGL图形界面的完整实战指南。内容涵盖从SDL库安装、SquareLine Studio环境配置、界面可视化设计,到工程导出、源码编译及常见错误排查的全流程。重点解析了如何将设计界面无缝集成到Linux开发流程中,并针对嵌入式设备移植提供了关键步骤,旨在帮助开发者高效避坑,快速上手LVGL界面开发。 阅读详情

中介者模式 (Mediator Pattern)

概述 (Overview)

中介者模式是一种行为型设计模式,它定义了一个对象来封装一组对象之间的交互方式。中介者使对象之间不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

Mediator Pattern is a behavioral design pattern that defines how a set of objects interact. It promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently.

意图 (Intent)

定义一个对象来封装一组对象的交互。中介者使对象之间不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently.

适用场景 (When to Use)

  • 当一组对象以定义良好但复杂的方式进行通信时
  • 当需要支持多个对象之间的复杂交互,但又不想让这些对象相互显式引用时
  • 当需要定制一个分布在多个类中的行为,而又不想生成太多子类时
  • 当对象之间的交互导致难以理解和维护的依赖关系时
  • 当需要集中控制对象之间的交互逻辑时
  • 当需要重用对象,但对象之间的依赖关系限制了它们的重用时

结构 (Structure)

基础中介者模式结构图 (Basic Mediator Pattern Structure)

«interface»
Mediator
+send(message: String, colleague: Colleague)
ConcreteMediator
-colleagues: List
+send(message: String, colleague: Colleague)
+addColleague(colleague: Colleague)
«abstract»
Colleague
#mediator: Mediator
+send(message: String)
+receive(message: String)
ConcreteColleague1
+receive(message: String)
ConcreteColleague2
+receive(message: String)
ConcreteColleague3
+receive(message: String)

实现方式 (Implementation Approaches)

1. 经典中介者模式 (Classic Mediator Pattern)

// 中介者接口 - Mediator Interface
public interface ChatMediator {
    void sendMessage(String message, User user);
    void addUser(User user);
    void removeUser(User user);
}

// 具体中介者 - Concrete Mediator
public class ChatRoom implements ChatMediator {
    private List<User> users;
    private String roomName;
    
    public ChatRoom(String roomName) {
        this.roomName = roomName;
        this.users = new ArrayList<>();
    }
    
    @Override
    public void sendMessage(String message, User sender) {
        System.out.println("\n[" + roomName + "] " + sender.getName() + " 发送消息: " + message);
        
        // 将消息发送给所有其他用户(不包括发送者)
        for (User user : users) {
            if (user != sender) {
                user.receiveMessage(message, sender.getName());
            }
        }
        
        // 记录消息历史
        logMessage(message, sender);
    }
    
    @Override
    public void addUser(User user) {
        users.add(user);
        System.out.println(user.getName() + " 加入了聊天室 [" + roomName + "]");
        
        // 通知其他用户有新成员加入
        for (User u : users) {
            if (u != user) {
                u.receiveMessage(user.getName() + " 加入了聊天室", "系统");
            }
        }
    }
    
    @Override
    public void removeUser(User user) {
        users.remove(user);
        System.out.println(user.getName() + " 离开了聊天室 [" + roomName + "]");
        
        // 通知其他用户有成员离开
        for (User u : users) {
            u.receiveMessage(user.getName() + " 离开了聊天室", "系统");
        }
    }
    
    private void logMessage(String message, User sender) {
        System.out.println("[日志] " + new Date() + " - " + sender.getName() + ": " + message);
    }
    
    public List<User> getUsers() {
        return new ArrayList<>(users);
    }
}

// 同事类 - Colleague Class
public abstract class User {
    protected ChatMediator mediator;
    protected String name;
    
    public User(ChatMediator mediator, String name) {
        this.mediator = mediator;
        this.name = name;
    }
    
    public abstract void sendMessage(String message);
    public abstract void receiveMessage(String message, String senderName);
    
    public String getName() {
        return name;
    }
}

// 具体同事类 - Concrete Colleague Classes
public class RegularUser extends User {
    public RegularUser(ChatMediator mediator, String name) {
        super(mediator, name);
    }
    
    @Override
    public void sendMessage(String message) {
        System.out.println("\n[" + name + "] 准备发送消息: " + message);
        mediator.sendMessage(message, this);
    }
    
    @Override
    public void receiveMessage(String message, String senderName) {
        System.out.println("[" + name + "] 收到来自 [" + senderName + "] 的消息: " + message);
    }
}

public class PremiumUser extends User {
    private boolean notificationsEnabled = true;
    
    public PremiumUser(ChatMediator mediator, String name) {
        super(mediator, name);
    }
    
    @Override
    public void sendMessage(String message) {
        System.out.println("\n[" + name + "] (高级用户) 发送消息: " + message);
        mediator.sendMessage(message, this);
    }
    
    @Override
    public void receiveMessage(String message, String senderName) {
        if (notificationsEnabled) {
            System.out.println("[" + name + "] (高级用户) 收到来自 [" + senderName + "] 的消息: " + message);
            // 高级用户可以收到特殊通知
            if (senderName.equals("系统")) {
                System.out.println("[" + name + "] 收到系统通知!");
            }
        }
    }
    
    public void setNotificationsEnabled(boolean enabled) {
        this.notificationsEnabled = enabled;
    }
}

public class AdminUser extends User {
    public AdminUser(ChatMediator mediator, String name) {
        super(mediator, name);
    }
    
    @Override
    public void sendMessage(String message) {
        System.out.println("\n[" + name + "] (管理员) 发送消息: " + message);
        mediator.sendMessage(message, this);
    }
    
    @Override
    public void receiveMessage(String message, String senderName) {
        System.out.println("[" + name + "] (管理员) 收到来自 [" + senderName + "] 的消息: " + message);
    }
    
    // 管理员特有的功能
    public void kickUser(String userName) {
        System.out.println("\n[" + name + "] (管理员) 踢出用户: " + userName);
        ChatRoom room = (ChatRoom) mediator;
        List<User> users = room.getUsers();
        for (User user : users) {
            if (user.getName().equals(userName)) {
                mediator.removeUser(user);
                break;
            }
        }
    }
    
    public void broadcastSystemMessage(String message) {
        System.out.println("\n[" + name + "] (管理员) 广播系统消息: " + message);
        mediator.sendMessage("[系统公告] " + message, this);
    }
}

// 客户端使用 - Client Usage
public class ChatRoomDemo {
    public static void main(String[] args) {
        System.out.println("=== 聊天室中介者模式演示 ===");
        
        // 创建聊天室(中介者)
        ChatRoom chatRoom = new ChatRoom("技术交流群");
        
        // 创建用户(同事)
        User user1 = new RegularUser(chatRoom, "张三");
        User user2 = new RegularUser(chatRoom, "李四");
        User user3 = new PremiumUser(chatRoom, "王五");
        User admin = new AdminUser(chatRoom, "管理员");
        
        // 用户加入聊天室
        chatRoom.addUser(user1);
        chatRoom.addUser(user2);
        chatRoom.addUser(user3);
        chatRoom.addUser(admin);
        
        // 用户发送消息
        user1.sendMessage("大家好!");
        user2.sendMessage("欢迎欢迎!");
        user3.sendMessage("很高兴加入这个群");
        
        // 管理员功能
        ((AdminUser) admin).broadcastSystemMessage("请大家遵守群规,文明交流");
        
        // 模拟用户离开
        chatRoom.removeUser(user2);
        
        // 继续聊天
        user1.sendMessage("李四怎么走了?");
        user3.sendMessage("可能有事吧");
        
        System.out.println("\n=== 演示完成 ===");
    }
}

2. 事件驱动中介者模式 (Event-Driven Mediator Pattern)

// 事件类型枚举 - Event Type Enum
public enum EventType {
    USER_LOGIN, USER_LOGOUT, USER_MESSAGE, SYSTEM_ALERT, FILE_UPLOAD, FILE_DOWNLOAD
}

// 事件类 - Event Class
public class Event {
    private EventType type;
    private Object data;
    private String source;
    private Date timestamp;
    
    public Event(EventType type, Object data, String source) {
        this.type = type;
        this.data = data;
        this.source = source;
        this.timestamp = new Date();
    }
    
    // Getters
    public EventType getType() { return type; }
    public Object getData() { return data; }
    public String getSource() { return source; }
    public Date getTimestamp() { return timestamp; }
    
    @Override
    public String toString() {
        return String.format("Event{type=%s, source='%s', timestamp=%s}", type, source, timestamp);
    }
}

// 事件监听器接口 - Event Listener Interface
public interface EventListener {
    void onEvent(Event event);
    boolean supports(EventType eventType);
}

// 具体事件监听器 - Concrete Event Listeners
public class UserEventListener implements EventListener {
    @Override
    public void onEvent(Event event) {
        switch (event.getType()) {
            case USER_LOGIN:
                System.out.println("用户事件监听器:用户登录 - " + event.getData());
                break;
            case USER_LOGOUT:
                System.out.println("用户事件监听器:用户登出 - " + event.getData());
                break;
            case USER_MESSAGE:
                System.out.println("用户事件监听器:用户消息 - " + event.getData());
                break;
            default:
                // 不处理其他类型的事件
                break;
        }
    }
    
    @Override
    public boolean supports(EventType eventType) {
        return eventType == EventType.USER_LOGIN || 
               eventType == EventType.USER_LOGOUT || 
               eventType == EventType.USER_MESSAGE;
    }
}

public class SystemEventListener implements EventListener {
    @Override
    public void onEvent(Event event) {
        switch (event.getType()) {
            case SYSTEM_ALERT:
                System.out.println("系统事件监听器:系统警报 - " + event.getData());
                handleSystemAlert(event.getData());
                break;
            default:
                break;
        }
    }
    
    @Override
    public boolean supports(EventType eventType) {
        return eventType == EventType.SYSTEM_ALERT;
    }
    
    private void handleSystemAlert(Object data) {
        System.out.println("处理系统警报: " + data);
        // 可以在这里添加发送邮件、短信等通知逻辑
    }
}

public class FileEventListener implements EventListener {
    @Override
    public void onEvent(Event event) {
        switch (event.getType()) {
            case FILE_UPLOAD:
                System.out.println("文件事件监听器:文件上传 - " + event.getData());
                handleFileUpload(event.getData());
                break;
            case FILE_DOWNLOAD:
                System.out.println("文件事件监听器:文件下载 - " + event.getData());
                handleFileDownload(event.getData());
                break;
            default:
                break;
        }
    }
    
    @Override
    public boolean supports(EventType eventType) {
        return eventType == EventType.FILE_UPLOAD || eventType == EventType.FILE_DOWNLOAD;
    }
    
    private void handleFileUpload(Object data) {
        System.out.println("处理文件上传: " + data);
        // 可以进行病毒扫描、文件大小检查等
    }
    
    private void handleFileDownload(Object data) {
        System.out.println("处理文件下载: " + data);
        // 可以记录下载日志、检查权限等
    }
}

// 事件总线(中介者)- Event Bus (Mediator)
public class EventBus implements EventMediator {
    private Map<EventType, List<EventListener>> listeners;
    private boolean asyncProcessing;
    private ExecutorService executorService;
    
    public EventBus(boolean asyncProcessing) {
        this.asyncProcessing = asyncProcessing;
        this.listeners = new ConcurrentHashMap<>();
        if (asyncProcessing) {
            this.executorService = Executors.newCachedThreadPool();
        }
        
        // 初始化事件类型映射
        for (EventType type : EventType.values()) {
            listeners.put(type, new CopyOnWriteArrayList<>());
        }
    }
    
    @Override
    public void publishEvent(Event event) {
        System.out.println("\n事件总线发布事件: " + event);
        
        List<EventListener> eventListeners = listeners.get(event.getType());
        
        if (asyncProcessing) {
            // 异步处理事件
            for (EventListener listener : eventListeners) {
                executorService.submit(() -> {
                    try {
                        if (listener.supports(event.getType())) {
                            listener.onEvent(event);
                        }
                    } catch (Exception e) {
                        System.err.println("事件监听器处理失败: " + e.getMessage());
                    }
                });
            }
        } else {
            // 同步处理事件
            for (EventListener listener : eventListeners) {
                try {
                    if (listener.supports(event.getType())) {
                        listener.onEvent(event);
                    }
                } catch (Exception e) {
                    System.err.println("事件监听器处理失败: " + e.getMessage());
                }
            }
        }
    }
    
    @Override
    public void subscribe(EventType eventType, EventListener listener) {
        listeners.get(eventType).add(listener);
        System.out.println("事件监听器订阅事件类型: " + eventType);
    }
    
    @Override
    public void unsubscribe(EventType eventType, EventListener listener) {
        listeners.get(eventType).remove(listener);
        System.out.println("事件监听器取消订阅事件类型: " + eventType);
    }
    
    @Override
    public void shutdown() {
        if (executorService != null) {
            executorService.shutdown();
            try {
                if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) {
                    executorService.shutdownNow();
                }
            } catch (InterruptedException e) {
                executorService.shutdownNow();
                Thread.currentThread().interrupt();
            }
        }
    }
}

// 事件源 - Event Source
public class UserService {
    private EventMediator eventBus;
    
    public UserService(EventMediator eventBus) {
        this.eventBus = eventBus;
    }
    
    public void userLogin(String username) {
        System.out.println("\n用户服务:用户登录 - " + username);
        Event event = new Event(EventType.USER_LOGIN, username, "UserService");
        eventBus.publishEvent(event);
    }
    
    public void userLogout(String username) {
        System.out.println("\n用户服务:用户登出 - " + username);
        Event event = new Event(EventType.USER_LOGOUT, username, "UserService");
        eventBus.publishEvent(event);
    }
    
    public void sendUserMessage(String username, String message) {
        System.out.println("\n用户服务:用户消息 - " + username + ": " + message);
        Map<String, String> messageData = new HashMap<>();
        messageData.put("username", username);
        messageData.put("message", message);
        Event event = new Event(EventType.USER_MESSAGE, messageData, "UserService");
        eventBus.publishEvent(event);
    }
}

public class FileService {
    private EventMediator eventBus;
    
    public FileService(EventMediator eventBus) {
        this.eventBus = eventBus;
    }
    
    public void uploadFile(String filename, long size) {
        System.out.println("\n文件服务:文件上传 - " + filename + " (" + size + " bytes)");
        Map<String, Object> fileData = new HashMap<>();
        fileData.put("filename", filename);
        fileData.put("size", size);
        Event event = new Event(EventType.FILE_UPLOAD, fileData, "FileService");
        eventBus.publishEvent(event);
    }
    
    public void downloadFile(String filename) {
        System.out.println("\n文件服务:文件下载 - " + filename);
        Event event = new Event(EventType.FILE_DOWNLOAD, filename, "FileService");
        eventBus.publishEvent(event);
    }
}

public class SystemMonitor {
    private EventMediator eventBus;
    
    public SystemMonitor(EventMediator eventBus) {
        this.eventBus = eventBus;
    }
    
    public void sendAlert(String alertMessage) {
        System.out.println("\n系统监控:发送警报 - " + alertMessage);
        Event event = new Event(EventType.SYSTEM_ALERT, alertMessage, "SystemMonitor");
        eventBus.publishEvent(event);
    }
}

// 客户端使用 - Client Usage
public class EventDrivenMediatorDemo {
    public static void main(String[] args) {
        System.out.println("=== 事件驱动中介者模式演示 ===");
        
        // 创建事件总线(中介者)
        EventBus eventBus = new EventBus(true); // 使用异步处理
        
        // 创建事件监听器
        EventListener userListener = new UserEventListener();
        EventListener systemListener = new SystemEventListener();
        EventListener fileListener = new FileEventListener();
        
        // 订阅事件
        eventBus.subscribe(EventType.USER_LOGIN, userListener);
        eventBus.subscribe(EventType.USER_LOGOUT, userListener);
        eventBus.subscribe(EventType.USER_MESSAGE, userListener);
        eventBus.subscribe(EventType.SYSTEM_ALERT, systemListener);
        eventBus.subscribe(EventType.FILE_UPLOAD, fileListener);
        eventBus.subscribe(EventType.FILE_DOWNLOAD, fileListener);
        
        // 创建事件源
        UserService userService = new UserService(eventBus);
        FileService fileService = new FileService(eventBus);
        SystemMonitor systemMonitor = new SystemMonitor(eventBus);
        
        // 模拟各种事件
        System.out.println("\n--- 模拟用户活动 ---");
        userService.userLogin("张三");
        userService.sendUserMessage("张三", "大家好!");
        fileService.uploadFile("document.pdf", 1024 * 1024);
        systemMonitor.sendAlert("CPU使用率过高");
        userService.userLogout("张三");
        fileService.downloadFile("report.xlsx");
        
        // 等待异步处理完成
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        // 清理资源
        eventBus.shutdown();
        
        System.out.println("\n=== 事件驱动中介者模式演示完成 ===");
    }
}

3. GUI组件中介者模式 (GUI Component Mediator Pattern)

// GUI组件中介者接口 - GUI Component Mediator Interface
public interface DialogMediator {
    void componentChanged(Component component);
    void registerComponent(Component component);
}

// 具体GUI中介者 - Concrete GUI Mediator
public class LoginDialog implements DialogMediator {
    private JTextField usernameField;
    private JPasswordField passwordField;
    private JCheckBox rememberMeCheckbox;
    private JButton loginButton;
    private JButton cancelButton;
    private JLabel statusLabel;
    
    public LoginDialog() {
        createComponents();
        setupLayout();
        setupEventHandlers();
    }
    
    private void createComponents() {
        usernameField = new JTextField(15);
        passwordField = new JPasswordField(15);
        rememberMeCheckbox = new JCheckBox("记住我");
        loginButton = new JButton("登录");
        cancelButton = new JButton("取消");
        statusLabel = new JLabel("请输入用户名和密码");
        
        // 注册组件到中介者
        registerComponent(usernameField);
        registerComponent(passwordField);
        registerComponent(rememberMeCheckbox);
        registerComponent(loginButton);
        registerComponent(cancelButton);
    }
    
    private void setupLayout() {
        JFrame frame = new JFrame("登录对话框");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        JPanel mainPanel = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets = new Insets(5, 5, 5, 5);
        
        // 用户名
        gbc.gridx = 0; gbc.gridy = 0;
        mainPanel.add(new JLabel("用户名:"), gbc);
        gbc.gridx = 1;
        mainPanel.add(usernameField, gbc);
        
        // 密码
        gbc.gridx = 0; gbc.gridy = 1;
        mainPanel.add(new JLabel("密码:"), gbc);
        gbc.gridx = 1;
        mainPanel.add(passwordField, gbc);
        
        // 记住我
        gbc.gridx = 1; gbc.gridy = 2;
        mainPanel.add(rememberMeCheckbox, gbc);
        
        // 状态标签
        gbc.gridx = 0; gbc.gridy = 3; gbc.gridwidth = 2;
        mainPanel.add(statusLabel, gbc);
        
        // 按钮面板
        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        buttonPanel.add(loginButton);
        buttonPanel.add(cancelButton);
        
        gbc.gridx = 0; gbc.gridy = 4; gbc.gridwidth = 2;
        mainPanel.add(buttonPanel, gbc);
        
        frame.add(mainPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    
    private void setupEventHandlers() {
        loginButton.addActionListener(e -> handleLogin());
        cancelButton.addActionListener(e -> handleCancel());
    }
    
    @Override
    public void registerComponent(Component component) {
        // 为组件添加事件监听器
        if (component instanceof JTextField) {
            ((JTextField) component).getDocument().addDocumentListener(new DocumentListener() {
                @Override
                public void insertUpdate(DocumentEvent e) {
                    componentChanged(component);
                }
                
                @Override
                public void removeUpdate(DocumentEvent e) {
                    componentChanged(component);
                }
                
                @Override
                public void changedUpdate(DocumentEvent e) {
                    componentChanged(component);
                }
            });
        } else if (component instanceof JCheckBox) {
            ((JCheckBox) component).addItemListener(e -> componentChanged(component));
        }
    }
    
    @Override
    public void componentChanged(Component component) {
        System.out.println("组件状态改变: " + component.getClass().getSimpleName());
        
        // 根据组件状态更新其他组件
        if (component == usernameField || component == passwordField) {
            updateLoginButtonState();
            updateStatusLabel();
        } else if (component == rememberMeCheckbox) {
            handleRememberMeChange();
        }
    }
    
    private void updateLoginButtonState() {
        String username = usernameField.getText().trim();
        String password = new String(passwordField.getPassword());
        
        // 只有当用户名和密码都不为空时才启用登录按钮
        boolean enabled = !username.isEmpty() && !password.isEmpty();
        loginButton.setEnabled(enabled);
        
        System.out.println("登录按钮状态更新: " + (enabled ? "启用" : "禁用"));
    }
    
    private void updateStatusLabel() {
        String username = usernameField.getText().trim();
        String password = new String(passwordField.getPassword());
        
        if (username.isEmpty() && password.isEmpty()) {
            statusLabel.setText("请输入用户名和密码");
        } else if (username.isEmpty()) {
            statusLabel.setText("请输入用户名");
        } else if (password.isEmpty()) {
            statusLabel.setText("请输入密码");
        } else {
            statusLabel.setText("准备就绪,可以点击登录");
        }
        
        statusLabel.setForeground(Color.BLACK);
    }
    
    private void handleRememberMeChange() {
        boolean selected = rememberMeCheckbox.isSelected();
        System.out.println("记住我选项: " + (selected ? "选中" : "未选中"));
        
        // 可以在这里添加记住密码的逻辑
        if (selected) {
            statusLabel.setText("将记住您的登录信息");
        } else {
            statusLabel.setText("不会记住您的登录信息");
        }
    }
    
    private void handleLogin() {
        String username = usernameField.getText().trim();
        String password = new String(passwordField.getPassword());
        boolean rememberMe = rememberMeCheckbox.isSelected();
        
        System.out.println("\n处理登录:");
        System.out.println("用户名: " + username);
        System.out.println("密码: " + password.replaceAll(".", "*"));
        System.out.println("记住我: " + rememberMe);
        
        // 模拟登录验证
        if ("admin".equals(username) && "password".equals(password)) {
            statusLabel.setText("登录成功!");
            statusLabel.setForeground(Color.GREEN);
            JOptionPane.showMessageDialog(null, "登录成功!", "成功", JOptionPane.INFORMATION_MESSAGE);
        } else {
            statusLabel.setText("用户名或密码错误");
            statusLabel.setForeground(Color.RED);
            JOptionPane.showMessageDialog(null, "用户名或密码错误", "错误", JOptionPane.ERROR_MESSAGE);
        }
    }
    
    private void handleCancel() {
        System.out.println("\n用户点击取消按钮");
        System.exit(0);
    }
}

// 客户端使用 - Client Usage
public class GuiMediatorDemo {
    public static void main(String[] args) {
        System.out.println("=== GUI组件中介者模式演示 ===");
        
        SwingUtilities.invokeLater(() -> {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeel());
            } catch (Exception e) {
                e.printStackTrace();
            }
            
            new LoginDialog();
            
            System.out.println("登录对话框已启动,可以测试以下功能:");
            System.out.println("1. 输入用户名和密码,观察登录按钮状态变化");
            System.out.println("2. 切换'记住我'复选框,观察状态标签变化");
            System.out.println("3. 使用admin/password登录,测试登录功能");
            System.out.println("4. 观察控制台输出,了解组件间的交互");
        });
    }
}

框架源码中的应用 (Framework Applications)

1. Java Timer - Timer类

// Java Timer中的中介者模式应用
// Java Timer Mediator Pattern Application

// 自定义任务 - Custom Task
public class CustomTimerTask extends TimerTask {
    private String taskName;
    private Runnable task;
    
    public CustomTimerTask(String taskName, Runnable task) {
        this.taskName = taskName;
        this.task = task;
    }
    
    @Override
    public void run() {
        System.out.println("[" + new Date() + "] 执行任务: " + taskName);
        try {
            task.run();
            System.out.println("任务执行成功: " + taskName);
        } catch (Exception e) {
            System.err.println("任务执行失败: " + taskName + ", 错误: " + e.getMessage());
        }
    }
    
    public String getTaskName() {
        return taskName;
    }
}

// 任务调度器 - Task Scheduler (Mediator)
public class TaskScheduler {
    private Timer timer;
    private Map<String, CustomTimerTask> scheduledTasks;
    
    public TaskScheduler() {
        this.timer = new Timer("TaskScheduler", true); // 作为守护线程
        this.scheduledTasks = new ConcurrentHashMap<>();
    }
    
    // 一次性任务
    public void scheduleOnce(String taskName, Runnable task, long delay) {
        CustomTimerTask timerTask = new CustomTimerTask(taskName, task);
        timer.schedule(timerTask, delay);
        scheduledTasks.put(taskName, timerTask);
        System.out.println("安排一次性任务: " + taskName + ", 延迟: " + delay + "ms");
    }
    
    // 重复执行任务
    public void scheduleRepeat(String taskName, Runnable task, long delay, long period) {
        CustomTimerTask timerTask = new CustomTimerTask(taskName, task);
        timer.scheduleAtFixedRate(timerTask, delay, period);
        scheduledTasks.put(taskName, timerTask);
        System.out.println("安排重复任务: " + taskName + ", 延迟: " + delay + "ms, 周期: " + period + "ms");
    }
    
    // 取消任务
    public boolean cancelTask(String taskName) {
        CustomTimerTask task = scheduledTasks.get(taskName);
        if (task != null) {
            boolean cancelled = task.cancel();
            if (cancelled) {
                scheduledTasks.remove(taskName);
                System.out.println("取消任务: " + taskName);
            }
            return cancelled;
        }
        return false;
    }
    
    // 取消所有任务
    public void cancelAllTasks() {
        for (String taskName : new ArrayList<>(scheduledTasks.keySet())) {
            cancelTask(taskName);
        }
    }
    
    // 关闭调度器
    public void shutdown() {
        System.out.println("关闭任务调度器...");
        cancelAllTasks();
        timer.cancel();
        System.out.println("任务调度器已关闭");
    }
    
    public List<String> getScheduledTasks() {
        return new ArrayList<>(scheduledTasks.keySet());
    }
}

// 任务执行器 - Task Executor (Colleague)
public class DataBackupTask implements Runnable {
    private String backupPath;
    
    public DataBackupTask(String backupPath) {
        this.backupPath = backupPath;
    }
    
    @Override
    public void run() {
        System.out.println("开始数据备份到: " + backupPath);
        // 模拟备份过程
        try {
            Thread.sleep(1000); // 模拟备份时间
            System.out.println("数据备份完成: " + backupPath);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            System.err.println("数据备份被中断: " + backupPath);
        }
    }
}

public class EmailNotificationTask implements Runnable {
    private String recipient;
    private String subject;
    private String content;
    
    public EmailNotificationTask(String recipient, String subject, String content) {
        this.recipient = recipient;
        this.subject = subject;
        this.content = content;
    }
    
    @Override
    public void run() {
        System.out.println("发送邮件通知:");
        System.out.println("收件人: " + recipient);
        System.out.println("主题: " + subject);
        System.out.println("内容: " + content);
        // 模拟邮件发送
        try {
            Thread.sleep(500); // 模拟发送时间
            System.out.println("邮件发送完成: " + subject);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            System.err.println("邮件发送被中断: " + subject);
        }
    }
}

public class SystemMonitorTask implements Runnable {
    private String metric;
    
    public SystemMonitorTask(String metric) {
        this.metric = metric;
    }
    
    @Override
    public void run() {
        System.out.println("监控系统指标: " + metric);
        // 模拟监控过程
        double value = Math.random() * 100;
        System.out.printf("当前%s值: %.2f%n", metric, value);
        
        if (value > 80) {
            System.out.println("警告: " + metric + " 超过阈值!");
        }
    }
}

// 客户端使用 - Client Usage
public class JavaTimerMediatorDemo {
    public static void main(String[] args) {
        System.out.println("=== Java Timer中介者模式演示 ===");
        
        TaskScheduler scheduler = new TaskScheduler();
        
        // 安排一次性任务
        scheduler.scheduleOnce("初始化任务", () -> {
            System.out.println("系统初始化完成");
        }, 1000);
        
        // 安排重复任务
        scheduler.scheduleRepeat("数据备份", new DataBackupTask("/backup/data"), 2000, 5000);
        scheduler.scheduleRepeat("邮件通知", new EmailNotificationTask("admin@example.com", "系统状态", "系统运行正常"), 3000, 10000);
        scheduler.scheduleRepeat("系统监控", new SystemMonitorTask("CPU使用率"), 1000, 3000);
        
        // 让任务运行一段时间
        try {
            Thread.sleep(15000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        // 取消特定任务
        scheduler.cancelTask("邮件通知");
        
        // 继续运行一段时间
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        // 关闭调度器
        scheduler.shutdown();
        
        System.out.println("\n=== Java Timer中介者模式演示完成 ===");
    }
}

2. Spring Framework - ApplicationContext

// Spring Framework中的ApplicationContext中介者模式应用
// Spring Framework ApplicationContext Mediator Pattern Application

// 自定义事件 - Custom Event
public class UserRegistrationEvent extends ApplicationEvent {
    private String username;
    private String email;
    
    public UserRegistrationEvent(Object source, String username, String email) {
        super(source);
        this.username = username;
        this.email = email;
    }
    
    public String getUsername() { return username; }
    public String getEmail() { return email; }
}

public class OrderPlacedEvent extends ApplicationEvent {
    private String orderId;
    private String userId;
    private BigDecimal amount;
    
    public OrderPlacedEvent(Object source, String orderId, String userId, BigDecimal amount) {
        super(source);
        this.orderId = orderId;
        this.userId = userId;
        this.amount = amount;
    }
    
    public String getOrderId() { return orderId; }
    public String getUserId() { return userId; }
    public BigDecimal getAmount() { return amount; }
}

// 事件监听器 - Event Listeners
@Component
public class EmailNotificationListener implements ApplicationListener<UserRegistrationEvent> {
    private static final Logger logger = LoggerFactory.getLogger(EmailNotificationListener.class);
    
    @Override
    public void onApplicationEvent(UserRegistrationEvent event) {
        logger.info("邮件通知监听器:用户注册 - username: {}, email: {}", 
                   event.getUsername(), event.getEmail());
        
        // 模拟发送欢迎邮件
        try {
            Thread.sleep(1000); // 模拟邮件发送时间
            logger.info("欢迎邮件发送成功给: {}", event.getEmail());
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            logger.error("邮件发送被中断", e);
        }
    }
}

@Component
public class SmsNotificationListener implements ApplicationListener<UserRegistrationEvent> {
    private static final Logger logger = LoggerFactory.getLogger(SmsNotificationListener.class);
    
    @Override
    public void onApplicationEvent(UserRegistrationEvent event) {
        logger.info("短信通知监听器:用户注册 - username: {}", event.getUsername());
        
        // 模拟发送短信
        try {
            Thread.sleep(500); // 模拟短信发送时间
            logger.info("注册短信发送成功给: {}", event.getUsername());
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            logger.error("短信发送被中断", e);
        }
    }
}

@Component
public class OrderProcessingListener implements ApplicationListener<OrderPlacedEvent> {
    private static final Logger logger = LoggerFactory.getLogger(OrderProcessingListener.class);
    
    @Override
    public void onApplicationEvent(OrderPlacedEvent event) {
        logger.info("订单处理监听器:订单已创建 - orderId: {}, userId: {}, amount: {}", 
                   event.getOrderId(), event.getUserId(), event.getAmount());
        
        // 模拟订单处理
        try {
            Thread.sleep(2000); // 模拟处理时间
            logger.info("订单处理完成: {}", event.getOrderId());
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            logger.error("订单处理被中断", e);
        }
    }
}

@Component
public class InventoryUpdateListener implements ApplicationListener<OrderPlacedEvent> {
    private static final Logger logger = LoggerFactory.getLogger(InventoryUpdateListener.class);
    
    @Override
    public void onApplicationEvent(OrderPlacedEvent event) {
        logger.info("库存更新监听器:更新库存 - orderId: {}", event.getOrderId());
        
        // 模拟库存更新
        try {
            Thread.sleep(800); // 模拟更新时间
            logger.info("库存更新完成 for order: {}", event.getOrderId());
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            logger.error("库存更新被中断", e);
        }
    }
}

// 事件发布服务 - Event Publishing Service
@Service
public class UserService {
    private static final Logger logger = LoggerFactory.getLogger(UserService.class);
    private final ApplicationEventPublisher eventPublisher;
    
    @Autowired
    public UserService(ApplicationEventPublisher eventPublisher) {
        this.eventPublisher = eventPublisher;
    }
    
    public void registerUser(String username, String email) {
        logger.info("用户服务:注册用户 - username: {}, email: {}", username, email);
        
        // 模拟用户注册逻辑
        try {
            Thread.sleep(100); // 模拟处理时间
            
            // 发布用户注册事件
            UserRegistrationEvent event = new UserRegistrationEvent(this, username, email);
            eventPublisher.publishEvent(event);
            
            logger.info("用户注册完成: {}", username);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            logger.error("用户注册被中断", e);
        }
    }
}

@Service
public class OrderService {
    private static final Logger logger = LoggerFactory.getLogger(OrderService.class);
    private final ApplicationEventPublisher eventPublisher;
    
    @Autowired
    public OrderService(ApplicationEventPublisher eventPublisher) {
        this.eventPublisher = eventPublisher;
    }
    
    public void placeOrder(String userId, BigDecimal amount) {
        String orderId = "ORDER-" + System.currentTimeMillis();
        logger.info("订单服务:创建订单 - orderId: {}, userId: {}, amount: {}", orderId, userId, amount);
        
        // 模拟订单创建逻辑
        try {
            Thread.sleep(200); // 模拟处理时间
            
            // 发布订单创建事件
            OrderPlacedEvent event = new OrderPlacedEvent(this, orderId, userId, amount);
            eventPublisher.publishEvent(event);
            
            logger.info("订单创建完成: {}", orderId);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            logger.error("订单创建被中断", e);
        }
    }
}

// 客户端使用 - Client Usage
@SpringBootApplication
public class SpringEventMediatorDemo {
    
    public static void main(String[] args) {
        SpringApplication.run(SpringEventMediatorDemo.class, args);
        
        System.out.println("=== Spring ApplicationContext中介者模式演示 ===");
        System.out.println("启动Spring Boot应用,测试事件发布/订阅功能");
    }
    
    @Component
    public static class EventMediatorDemoRunner implements CommandLineRunner {
        
        @Autowired
        private UserService userService;
        
        @Autowired
        private OrderService orderService;
        
        @Override
        public void run(String... args) throws Exception {
            System.out.println("\n--- 开始Spring事件中介者模式演示 ---");
            
            // 演示用户注册事件
            System.out.println("\n--- 演示用户注册事件 ---");
            userService.registerUser("张三", "zhangsan@example.com");
            userService.registerUser("李四", "lisi@example.com");
            
            // 等待事件处理完成
            Thread.sleep(2000);
            
            // 演示订单创建事件
            System.out.println("\n--- 演示订单创建事件 ---");
            orderService.placeOrder("USER-123", new BigDecimal("299.99"));
            orderService.placeOrder("USER-456", new BigDecimal("599.99"));
            
            // 等待事件处理完成
            Thread.sleep(3000);
            
            System.out.println("\nSpring事件中介者模式演示完成");
        }
    }
}

中介者模式与其他模式比较 (Comparison with Other Patterns)

特性中介者模式观察者模式责任链模式外观模式
目的对象交互解耦事件通知请求传递接口简化
关注点交互集中化状态变化通知处理链子系统封装
使用场景复杂对象交互发布-订阅多级处理简化接口
结构特点中介者协调观察者注册链式结构统一接口
控制方式集中控制事件广播链式传递门面封装

最佳实践 (Best Practices)

1. 中介者设计 (Mediator Design)

  • 保持中介者的职责单一,避免成为"上帝对象"
  • 明确定义同事对象之间的交互协议
  • 考虑中介者的可扩展性和可维护性

2. 同事对象设计 (Colleague Design)

  • 保持同事对象的独立性
  • 避免同事对象直接相互引用
  • 确保同事对象只与中介者通信

3. 交互协议设计 (Interaction Protocol Design)

  • 定义清晰的交互接口和消息格式
  • 考虑支持同步和异步交互
  • 处理好错误和异常情况

4. 性能优化 (Performance Optimization)

  • 避免中介者成为性能瓶颈
  • 考虑使用异步处理提高响应速度
  • 合理使用缓存和批处理技术

5. 可测试性 (Testability)

  • 设计易于测试的中介者和同事对象
  • 使用依赖注入提高可测试性
  • 考虑使用模拟对象进行单元测试

优缺点 (Pros and Cons)

优点 (Advantages)

  • 降低耦合度:减少了对象之间的直接依赖关系
  • 集中控制:将交互逻辑集中在中介者中
  • 易于维护:修改交互逻辑只需修改中介者
  • 支持复用:同事对象可以更容易地被复用
  • 简化对象:同事对象只需要了解中介者

缺点 (Disadvantages)

  • 中介者复杂化:中介者可能变得过于复杂
  • 单点故障:中介者出现问题会影响整个系统
  • 性能开销:通过中介者转发消息可能带来性能损失
  • 设计难度:需要仔细设计中介者的接口和逻辑
  • 过度集中:可能导致逻辑过度集中在中介者中

实际应用建议 (Practical Application Tips)

1. 适度使用

  • 只在对象交互复杂时使用中介者模式
  • 避免过度使用导致中介者过于复杂
  • 考虑其他模式如观察者模式作为替代

2. 分层设计

  • 考虑使用多层中介者来处理复杂的交互
  • 将不同类型的交互分离到不同的中介者
  • 使用组合模式组织多个中介者

3. 异常处理

  • 在中介者中处理好异常情况
  • 确保一个同事对象的异常不会影响其他对象
  • 提供适当的错误恢复机制

4. 文档和监控

  • 为中介者的交互协议提供清晰的文档
  • 实现交互过程的监控和日志记录
  • 考虑使用AOP来记录交互历史

总结 (Summary)

中介者模式是一种强大的行为型设计模式,它通过引入一个中介对象来封装一组对象之间的交互,从而降低了对象之间的耦合度。这种模式特别适合处理多个对象之间的复杂交互场景。

在实际应用中,中介者模式广泛应用于:

  • GUI组件交互管理
  • 聊天室和消息系统
  • 事件驱动架构
  • 工作流引擎
  • 微服务通信协调

通过合理使用中介者模式,可以构建出松耦合、易维护的系统架构。然而,需要注意避免中介者变得过于复杂,以及避免单点故障问题。在设计时应该权衡好集中控制和分散逻辑之间的关系,确保系统的可扩展性和可维护性。

SAP使用XCO框架创建RAP所有对象 通过XCO框架自动生成SAP ABAP开发对象。 阅读详情

相关推荐

别再死记硬背了!用Wireshark抓包实战,5分钟搞懂GRE、L2TP、IPsec的区别

本文通过Wireshark抓包实战,详细解析GRE、L2TP和IPsec三大隧道协议的核心差异与应用场景。从报文结构到配置示例,帮助网络工程师快速掌握这些协议的本质,提升VPN部署与故障排查能力。特别适合准备HCIP认证的工程师深化理解。

weixin_30352645的博客 439

(15)Java设计模式 - 中介者模式(Mediator Pattern)

中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。 介绍 意图:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。主要解决:对象与对象之间存在大量的关联关系,...

潘建南的博客 930

Qt Creator设计器里也能拖拽?5步将你的QML自定义控件变成可视化插件(Qt6.5+)

本文详细介绍了如何在Qt Creator设计器中实现QML自定义控件的可视化拖拽功能(Qt6.5+)。通过5个步骤,从构建可插件化的QML控件基础到部署插件到设计器环境,帮助开发者将自定义控件转化为设计器插件,提升团队协作效率。特别适合需要频繁调整UI样式的开发场景。

weixin_29214559的博客 171

极速理解设计模式系列:15.中介者模式(Mediator Pattern)

五个角色:抽象中介者(Mediator)、具体中介者(ConcreteMediator)、同事类(Colleague)、具体同事类(ConcreteColleague)、客户端(Client) 抽象中介者(Mediator):定义接口让同事对象之间通讯 具体中介者(ConcreteMediator):实现接口,并且协调维...

weixin_34051201的博客 73

STM32串口DMA双缓冲机制实战:提升数据传输效率的终极方案

本文深入解析了STM32串口DMA双缓冲机制的核心原理与实战配置。通过对比传统中断方式,阐述了双缓冲如何实现数据接收与处理的“无缝接力”,从而在工业传感器数据采集等高负载场景下,将CPU占用率降至极低水平并彻底避免数据丢失。文章提供了基于标准外设库的详细配置步骤、中断处理逻辑及性能实测数据,是提升嵌入式系统串口通信效率和可靠性的终极方案。

weixin_29192365的博客 80

嵌入式视频应用开发者必读:嵌入式Linux+FFmpeg硬件编解码实战指南

在嵌入式Linux上,FFmpeg支持多种硬件加速API,比如VAAPI、VDPAU、CUDA,以及针对特定平台的专用接口(如NVIDIA的NVENC、Intel的QSV、ARM的Mali)。FFmpeg的硬件解码通过-hwaccel参数启用,咱们以常见的H.264和HEVC(H.265)格式为例,展示如何用VAAPI和V4L2实现高效解码。: FFmpeg硬件加速需要额外的库,比如libva(VAAPI)、libv4l2(V4L2)或libnvcodec(CUDA)。

大模型大数据攻城狮的专栏 2204

【设计模式】——中介者模式(Mediator Pattern)

中介者模式(Mediator Pattern)是一种对象行为型模式,主要用于降低系统中对象之间的耦合度,通过引入一个中介者来封装对象之间的交互,使得对象之间的交互更加灵活和可扩展。本文将详细介绍中介者模式在C++中的实现方式及其应用场景。

J^T的博客 902

Megatron-LM从头训练大语言模型:并行策略图示【Tensor并行、Pipeline并行、Data并行、Sequence并行、virtual_pipeline并行、Context并行】

节点包含的层每GPU的参数内存每GPU的激活内存节点0Stage 0层1-1212层参数/2 (TP切分)8k序列激活 (CP切分)节点1Stage 1层13-2412层参数/2 (TP切分)8k序列激活 (CP切分)节点2Stage 2层25-3612层参数/2 (TP切分)8k序列激活 (CP切分)节点3Stage 3层37-4812层参数/2 (TP切分)8k序列激活 (CP切分)负载均衡:每个节点处理相同数量的层(12层)内存优化。

u013250861的博客 285

Java设计模式之中介者模式(Mediator Pattern)

中介者模式定义了一个中介对象来封装一系列对象之间的交互。这种模式使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。在中介者模式中,中介者负责处理对象间的通信和协作,对象间不再直接交互,而是通过中介者来间接通信。

shiming8879的博客 964

YOLO11改进 - 卷积Conv | StripBlockStripBlock大条带卷积块,通过顺序条带卷积捕获方向性长程依赖,强化高长宽比目标特征提取 | AAAI 2026

本文介绍了面向高纵横比目标检测的条带卷积模块——StripBlock,适用于遥感、船只、车道等细长结构目标的特征增强。该方法先通过 `5×5` 深度卷积提取局部空间信息,再利用 `1×19` 与 `19×1` 的正交长条卷积分别建模横向和纵向长程依赖,最后通过 `1×1` 卷积生成空间注意力权重,并以逐元素门控方式重标定输入特征。我们将 StripBlock 成功集成进 YOLO11,在检测头的多尺度特征层中引入条带式空间建模能力,从而增强模型对细长目标和复杂遥感场景的定位与识别效果。

魔改工程师的博客 234

44、单级静态电流消耗最小化方法及功率优化比较器设计

本文探讨了单级静态电流消耗最小化方法及功率优化的多米诺逻辑比较器设计。通过分析类“AB”输入CMOS差分对电路,提出利用补偿电流源实现高低电流模式切换,提升运算放大器性能;结合VTCMOS与时钟门控技术,在90nm CMOS中设计低功耗比较器,并采用多米诺逻辑提高速度与能效。通过对比传统与改进型多米诺逻辑的静态功耗、动态功耗、延迟和PDP,验证了所提方案在高性能与低功耗方面的优势,适用于便携式设备等对能效要求严苛的应用场景。

pp12345的博客 121

C#设计模式(18)——中介者模式(Mediator Pattern)

C#设计模式(18)——中介者模式(Mediator Pattern) 一、引言   在现实生活中,有很多中介者模式的身影,例如QQ游戏平台,聊天室、QQ群和短信平台,这些都是中介者模式在现实生活中的应用,下面就具体分享下我对中介者模式的理解。 二、 中介者模式的介绍 2.1 中介者模式的定义   从生活中的例子可以看出,不论是QQ游戏还是...

fgmah2000的博客 284

从原理到实战:深入解析 Synopsys VCS 仿真快照技术,提升验证效率

VCS Checkpoint 技术摘要 VCS Checkpoint 是 Synopsys VCS 提供的仿真状态快照功能,可将完整的仿真状态(寄存器、存储器、时钟、随机种子等)序列化保存。主要应用场景包括:跳过耗时初始化阶段、覆盖率驱动验证、Debug复现和UVM分阶段验证。核心原理是对仿真内核状态的完整序列化,需注意文件句柄等特殊对象需手动处理。 使用方式: 编译时添加 -checkpoint 选项 运行时通过 $save 系统任务或 +checkpoint 参数保存状态 通过 +restore 参数恢

元直的博客 248

23种设计模式----中介者模式(Mediator Pattern)

中介者模式,定义了一个中介对象来封装一系列对象之间的交互关系。中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为。 中介者模式设计两个具体对象,一个是用户类,另一个是中介者类,根据针对接口编程原则,则需要把这两类角色进行抽象,所以中介者模式中就有了4类角色,它们分别是:抽象中介者角色,具体中介者角色、抽象同事类和具体同事类。中介者类是起到协调各个对象的...

u012075901的博客 224

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

中介者模式(Mediator Pattern)——C#设计模式十八

原文地址:http://www.cnblogs.com/zhili/p/MediatorPattern.html 原文作者:Learning hard 一、引言 在现实生活中,有很多中介者模式的身影,例如QQ游戏平台,聊天室、QQ群和短信平台,这些都是中介者模式在现实生活中的应用,下面就具体分享下我对中介者模式的理解。 二、 中介者模式的介绍 2.1 中介者模式的定义 从生活中的例子可以看出,不论...

U3D开发 271

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

中介者模式(Mediator Pattern)

定义 一个中介对象来封装系列对象之间的交互。中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互。

Arbboter的专栏 3329

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

D18:C#设计模式之十七中介者模式(Mediator Pattern)【行为型】

一、引言 今天我们开始讲“行为型”设计模式的第五个模式,该模式是【中介者模式】,英文名称是:Mediator Pattern。还是老套路,先从名字上来看看。“中介者模式”我第一次看到这个名称,我的理解是,在两个对象中间增加一个“中间对象”,“中间对象”协调两个对象的关系,但是随着理解的深入,“中间对象”处理关系的对象可能不只是两个对象,可能是三个对象,或者更多对象。中介者模式在现实生活中的例...

. 439

C#设计模式之十七中介者模式(Mediator Pattern)【行为型】

原文:C#设计模式之十七中介者模式(Mediator Pattern)【行为型】一、引言   今天我们开始讲“行为型”设计模式的第五个模式,该模式是【中介者模式】,英文名称是:Mediator Pattern。还是老套路,先从名字上来看看。“中介者模式”我第一次看到这个名称,我的理解是,在两个对象中间增加一个“中间对象”,“中间对象”协调两个对象的关系,但是随着理解的深入,“中间对象”处理关系的对...

weixin_34026276的博客 106

C#设计模式之中介者模式(Mediator Pattern)

一、引言 在现实生活中,有很多中介者模式的身影,例如QQ游戏平台,聊天室、QQ群和短信平台,这些都是中介者模式在现实生活中的应用,下面就具体分享下我对中介者模式的理解。 二、 中介者模式的介绍 2.1 中介者模式的定义 从生活中的例子可以看出,不论是QQ游戏还是QQ群,它们都是充当一个中间平台,QQ用户可以登录这个中间平台与其他QQ用户进行交流,如果没有这些中间平台,我们如

MR_yuan24的专栏 652

4.5 中介者模式 (Mediator Pattern)

中介者模式提供了一种有效的方式来管理对象之间的交互,它可以降低系统的耦合度,提高系统的可维护性和可扩展性。但是,在使用中介者模式时,需要注意中介者类的复杂度,避免中介者类承担过多的责任。

338
上一篇: 设计模式-14迭代器模式Iterator Pattern
下一篇: 设计模式-16备忘录模式Memento Pattern
d3y1
博客等级 码龄12年 1438粉丝 2777原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值