博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面向对象设计原则详解:迪米特法则
阅读量:6125 次
发布时间:2019-06-21

本文共 3497 字,大约阅读时间需要 11 分钟。

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

Form2图:

public partial class Form1 : Form      {          public Form1()          {              InitializeComponent();          }          private void button1_Click(object sender, EventArgs e)          {              Form2 form2 = new Form2(this);                form2.ShowDialog(this);          }            void form2_ShowMessageEventHandler(object sender, MessageEventArgs e)          {              this.richTextBox1.Text = e.MessageString;          }      }

Form2中定义了Form1的引用。

public partial class Form2 : Form      {          public Form2()          {              InitializeComponent();          }            private Form1 form1;            public Form2(Form1 form1)          {              InitializeComponent();                this.form1 = form1;          }            private void button1_Click(object sender, EventArgs e)          {              form1.richTextBox1.Text = "Form2的消息";          }      }

 运行,点击Form1的button,Form2窗口显示出来,再点击Form2的button,Form1的richtextbox1内容为:"Form2的消息"。

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

public class MessageEventArgs:EventArgs      {          private string messageString = string.Empty;            public MessageEventArgs(string message)          {              this.messageString = message;          }            public string MessageString          {              get              {                  return messageString;              }          }      }

Form2中定义事件

public partial class Form2 : Form      {          public event EventHandler
ShowMessageEventHandler; public Form2() { InitializeComponent(); } //private Form1 form1; //public Form2(Form1 form1) //{ // InitializeComponent(); // this.form1 = form1; //} //private void button1_Click(object sender, EventArgs e) //{ // form1.richTextBox1.Text = "Form2的消息"; //} private void button1_Click(object sender, EventArgs e) { if (this.ShowMessageEventHandler != null) { ShowMessageEventHandler(this, new MessageEventArgs("Form2的消息")); } } }

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

public partial class Form1 : Form      {          public Form1()          {              InitializeComponent();          }          private void button1_Click(object sender, EventArgs e)          {              Form2 form2 = new Form2();                form2.ShowMessageEventHandler += new EventHandler
(form2_ShowMessageEventHandler); form2.ShowDialog(this); //Form2 form2 = new Form2(this); //form2.ShowDialog(this); } void form2_ShowMessageEventHandler(object sender, MessageEventArgs e) { this.richTextBox1.Text = e.MessageString; } }

  这样运行,结果如下:

 
 
显然,后者的耦合性大大降低,即使删除掉Form1,要改用另一个FormNew,不用去改动Fom2,只需在FomrNew中重新注册事件,并绑定方法就可以了。也增强了Form2的复用性。一举多得何乐而不为。
代码:

转载地址:http://swfua.baihongyu.com/

你可能感兴趣的文章
会计基础_001
查看>>
ajax请求拿到多条数据拼接显示在页面中
查看>>
小程序: 查看正在写的页面
查看>>
dedecms生成文档数据库崩溃 mysql daemon failed to start
查看>>
Linux的50个基本命令
查看>>
Objective-C中创建单例方法的步骤
查看>>
Jenkins持续集成环境部署
查看>>
emoji等表情符号存mysql的方法
查看>>
检查磁盘利用率并且定期发送告警邮件
查看>>
MWeb 1.4 新功能介绍二:静态博客功能增强
查看>>
linux文本模式和文本替换功能
查看>>
Windows SFTP 的安装
查看>>
摄像机与绕任意轴旋转
查看>>
rsync 服务器配置过程
查看>>
预处理、const与sizeof相关面试题
查看>>
爬虫豆瓣top250项目-开发文档
查看>>
Elasticsearch增删改查
查看>>
oracle归档日志增长过快处理方法
查看>>
有趣的数学书籍
查看>>
teamviewer 卸载干净
查看>>