不使用事件机制
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();} }
这样做的好处是,不需要修改按钮的代码,只需要在需要让按钮执行其他操作时,将对应的事件处理程序注册为按钮的事件处理程序即可。这就体现了事件机制的解耦和可扩展性。