当前位置:   article > 正文

面向对象设计原则详解:迪米特法则_迪米特原则 菜鸟

迪米特原则 菜鸟
 定义:如果两个类不必彼此通信,那么这两个类就不应该发生直接的相互作用。如果其中一个类需要调用另一个类的某个方法,可以通过第三者转发这个调用。其本意是,设计中要注意松耦合。
    这个很好理解,如果类和类之间没什么联系就不说了。但是如果类之间有联系,比如类1要调用类2的方法或属性,不能说我在类1中引用类2,然后利用类2的引用调用类2的属性或方法。正确的处理是用委托或事件。这样减少类的耦合。下面拿例子说明。
比如有两个窗体Form1和Form2,Form2有一个button,当点击button的时候Form1显示一句话。不按照迪米特法则的实现:
Form1图:

Form2图:

  1. public partial class Form1 : Form
  2. {
  3. public Form1()
  4. {
  5. InitializeComponent();
  6. }
  7. private void button1_Click(object sender, EventArgs e)
  8. {
  9. Form2 form2 = new Form2(this);
  10. form2.ShowDialog(this);
  11. }
  12. void form2_ShowMessageEventHandler(object sender, MessageEventArgs e)
  13. {
  14. this.richTextBox1.Text = e.MessageString;
  15. }
  16. }

Form2中定义了Form1的引用。

  1. public partial class Form2 : Form
  2. {
  3. public Form2()
  4. {
  5. InitializeComponent();
  6. }
  7. private Form1 form1;
  8. public Form2(Form1 form1)
  9. {
  10. InitializeComponent();
  11. this.form1 = form1;
  12. }
  13. private void button1_Click(object sender, EventArgs e)
  14. {
  15. form1.richTextBox1.Text = "Form2的消息";
  16. }
  17. }

 运行,点击Form1的button,Form2窗口显示出来,再点击Form2的button,Form1的richtextbox1内容为:"Form2的消息"。
 如下图:
 
 这样也实现了要求。这样的话为了使Form2中能访问到Form1的richtextbox1,必须要把richtextbox1定义成Public。richtextbox1是Form1的私有成员,一旦公布出来破坏了封装性。而且假如,在软件发布后,决定不要Form1了,又新建另一个FormNew显示Fom2,那么就要去删掉Form1的同时还要再打开Form2,重新定义一个FormNew的引用。改动太多,不符合开放封闭原则。
 那么修改它,按照迪米特法则修改。通过第三者转发这个调用,我们利用事件来完成。修改代码如下:
 增加一个传递的类:

  1. public class MessageEventArgs:EventArgs
  2. {
  3. private string messageString = string.Empty;
  4. public MessageEventArgs(string message)
  5. {
  6. this.messageString = message;
  7. }
  8. public string MessageString
  9. {
  10. get
  11. {
  12. return messageString;
  13. }
  14. }
  15. }

Form2中定义事件

  1. public partial class Form2 : Form
  2. {
  3. public event EventHandler<MessageEventArgs> ShowMessageEventHandler;
  4. public Form2()
  5. {
  6. InitializeComponent();
  7. }
  8. //private Form1 form1;
  9. //public Form2(Form1 form1)
  10. //{
  11. // InitializeComponent();
  12. // this.form1 = form1;
  13. //}
  14. //private void button1_Click(object sender, EventArgs e)
  15. //{
  16. // form1.richTextBox1.Text = "Form2的消息";
  17. //}
  18. private void button1_Click(object sender, EventArgs e)
  19. {
  20. if (this.ShowMessageEventHandler != null)
  21. {
  22. ShowMessageEventHandler(this, new MessageEventArgs("Form2的消息"));
  23. }
  24. }
  25. }

 Form1注册这个事件,并绑定方法。

  1. public partial class Form1 : Form
  2. {
  3. public Form1()
  4. {
  5. InitializeComponent();
  6. }
  7. private void button1_Click(object sender, EventArgs e)
  8. {
  9. Form2 form2 = new Form2();
  10. form2.ShowMessageEventHandler += new EventHandler<MessageEventArgs>(form2_ShowMessageEventHandler);
  11. form2.ShowDialog(this);
  12. //Form2 form2 = new Form2(this);
  13. //form2.ShowDialog(this);
  14. }
  15. void form2_ShowMessageEventHandler(object sender, MessageEventArgs e)
  16. {
  17. this.richTextBox1.Text = e.MessageString;
  18. }
  19. }

  这样运行,结果如下:
 
 
显然,后者的耦合性大大降低,即使删除掉Form1,要改用另一个FormNew,不用去改动Fom2,只需在FomrNew中重新注册事件,并绑定方法就可以了。也增强了Form2的复用性。一举多得何乐而不为。
代码:http://download.csdn.net/detail/yysyangyangyangshan/4131207

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/403983
推荐阅读
相关标签
  

闽ICP备14008679号