七大设计原则之迪米特

首页 » 设计模式 » 七大设计原则之迪米特

只与直接朋友进行通信

直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象直接是朋友关系。耦合的方式有依赖、关联、聚合等,其中,当出现成员变量方法参数方法返回值中的类为直接朋友,而出现在局部变量中的类不会直接朋友,也就是陌生的类最好不要以局部变量的形式出现在类的内部。对于被依赖的类不管多复杂,都尽量将逻辑封装在类的内部,对外除了提供的public方法,不对外泄露任何信息。

违反法则例子

package 迪米特;

import java.util.ArrayList;
import java.util.List;

public class test {
public static void main(String[] args) {
 SchoolManger school=new SchoolManger();
 //输出学院员工ID和学校总部员工ID
 school.printAll(new CollegeManager());
 
}
}
//学校总部员工
class Emplyee{
 private String id;
 public void setid(String id) {
  this.id=id;
 }
 public String getid() {
  return id;
 }
}
//学院员工
class CollegeEmplyee{
 private String id;
 public void setid(String id) {
  this.id=id;
 }
 public String getid() {
  return id;
 }
}
//学院管理员工
class CollegeManager{
 //直接朋友
 public List<CollegeEmplyee> getAllEmployee(){
 List<CollegeEmplyee> list=new ArrayList<CollegeEmplyee>();
 for(int i=0;i<10;i++) {
  CollegeEmplyee emp=new CollegeEmplyee();
  emp.setid("学院员工ID="+i);
  list.add(emp);
 }
 return list;
}
}
//学校管理
class SchoolManger{
 //返回学校总部的员工
 public List<Emplyee>getAllEmployee(){
 List<Emplyee> list=new ArrayList<Emplyee>();
 for(int i=0;i<5;i++) {
  Emplyee emp=new Emplyee();
  emp.setid("学校总部员工ID="+i);
  list.add(emp);
 }
 return list;
}
 //直接朋友
void printAll(CollegeManager sub) {
 //CollegeEmplyee不是直接朋友,违背迪米特法则
 //它是以局部变量的形式出现的
 List<CollegeEmplyee>list1=sub.getAllEmployee();
 System.out.println("-----------学院员工---------");
 for(CollegeEmplyee e:list1) {
  System.out.println(e.getid());
 }
 List<Emplyee>list2=this.getAllEmployee();
 System.out.println("-----------学校总部员工---------");
 for(Emplyee e:list2) {
  System.out.println(e.getid());
 }
}
}

改进后

package 迪米特;

import java.util.ArrayList;
import java.util.List;

public class test {
public static void main(String[] args) {
 SchoolManger school=new SchoolManger();
 //输出学院员工ID和学校总部员工ID
 school.printAll(new CollegeManager());
 
}
}
//学校总部员工
class Emplyee{
 private String id;
 public void setid(String id) {
  this.id=id;
 }
 public String getid() {
  return id;
 }
}
//学院员工
class CollegeEmplyee{
 private String id;
 public void setid(String id) {
  this.id=id;
 }
 public String getid() {
  return id;
 }
}
//学院管理员工
class CollegeManager{
 //直接朋友
 public List<CollegeEmplyee> getAllEmployee(){
 List<CollegeEmplyee> list=new ArrayList<CollegeEmplyee>();
 for(int i=0;i<10;i++) {
  CollegeEmplyee emp=new CollegeEmplyee();
  emp.setid("学院员工ID="+i);
  list.add(emp);
 }
 return list;
}
 public void printEmployee() {
  //解决办法
  //将输出学院员工的方法,封装到CollegeMange
  List<CollegeEmplyee>list1=this.getAllEmployee();
  System.out.println("-----------学院员工---------");
  for(CollegeEmplyee e:list1) {
   System.out.println(e.getid());
  }
 }
}
//学校管理
class SchoolManger{
 //返回学校总部的员工
 public List<Emplyee>getAllEmployee(){
 List<Emplyee> list=new ArrayList<Emplyee>();
 for(int i=0;i<5;i++) {
  Emplyee emp=new Emplyee();
  emp.setid("学校总部员工ID="+i);
  list.add(emp);
 }
 return list;
}
 //直接朋友
void printAll(CollegeManager sub) {

 sub.printEmployee();
 
 List<Emplyee>list2=this.getAllEmployee();
 System.out.println("-----------学校总部员工---------");
 for(Emplyee e:list2) {
  System.out.println(e.getid());
 }
}
}
分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

 



觉得文章有用就打赏一下弟弟吧

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.5主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
正在播放:

作者想对您说:

累了就停下来听首歌吧

听完后会给您一个好心情

最后

等到您不容易

还希望您能多待一会儿

      00:00/00:00