不使用事件机制
class Button { public void OnClick() { // 调用文本框的方法显示消息 TextBox.ShowMessage("按钮被点击了!"); } } class TextBox { public static void ShowMessage(string message) { Console.WriteLine(message); } }
如果你想要在按钮被点击时执行其他操作,比如弹出一个对话框,那么你就需要修改按钮的代码
class Button { public void OnClick() { // 调用文本框的方法显示消息 TextBox.ShowMessage("按钮被点击了!"); // 新增功能,在按钮被点击时弹出一个对话框 DialogBox.ShowDialog("您点击了按钮!"); } } class TextBox { public static void ShowMessage(string message) { Console.WriteLine(message); } }
这样做的问题是,按钮和文本框之间的耦合度变高了,按钮需要直接调用文本框的方法来显示消息,并且还需要负责弹出对话框。如果你想要在其他地方也执行弹出对话框的操作,那么也需要在其他地方重复这些代码,导致代码冗余和维护成本高。
如果你使用事件机制,你可以将弹出对话框的操作封装成一个事件处理程序,然后在需要执行这个操作的地方订阅该事件即可,不需要修改按钮的代码:?
class Button { // 定义一个事件,表示按钮被点击的事件 public event EventHandler Click; public void OnClick() { // 触发按钮被点击的事件 Click?.Invoke(this, EventArgs.Empty); } } class TextBox { public void ShowMessage(object sender, EventArgs e) { Console.WriteLine("按钮被点击了!"); } } class DialogBox { public static void ShowDialog(object sender, EventArgs e) { Console.WriteLine("您点击了按钮!"); } } class Program { static void Main(string[] args) { Button button = new Button(); TextBox textBox = new TextBox(); DialogBox dialogBox = new DialogBox(); // 将文本框的 ShowMessage 方法和对话框的 ShowDialog 方法注册为按钮被点击时的事件处理程序 button.Click += textBox.ShowMessage; button.Click += dialogBox.ShowDialog; // 模拟按钮点击 button.OnClick(); Console.ReadLine(); } }
这样做的好处是,不需要修改按钮的代码,只需要在需要让按钮执行其他操作时,将对应的事件处理程序注册为按钮的事件处理程序即可。这就体现了事件机制的解耦和可扩展性。