其他分享
首页 > 其他分享> > 11.迪米特法则

11.迪米特法则

作者:互联网

package dmitryRule;

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

/**
 * 迪米特法则
 * 问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。
 * 
 * 百度百科:
 * 迪米特法则(Law of Demeter)又叫作最少知道原则(Least Knowledge Principle 简写LKP),
 * 就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。英文简写为: LoD.
 * 
 * 模式与意义
 * 	   △  迪米特法则可以简单说成:talk only to your immediate friends。 对于OOD来说,
 * 	          又被解释为下面几种方式:一个软件实体应当尽可能少的与其他实体发生相互作用。每一个软件单位对其他的单位都只有最少的知识,
 * 	          而且局限于那些与本单位密切相关的软件单位。
 *   △ 迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,
 *     因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。
 *	   △ 迪米特法则不希望类之间建立直接的联系。如果真的有需要建立联系,也希望能通过它的友元类来转达。
 *    因此,应用迪米特法则有可能造成的一个后果就是:系统中存在大量的中介类,
 *    这些类之所以存在完全是为了传递类之间的相互调用关系——这在一定程度上增加了系统的复杂度。
 * 
 * 下边我设计一个公司发工资  总公司领导给总公司员工发  分公司领导给分公司员工发  但是总公司不直接给分公司员工发 因为不在一起办公  
 *  如果你说转账可以     我会说:现金工资  !!!    只是举例 不要场景不要太认真
 * 
 * 
 *@author LiMing  E-mail:1151143484@qq.com
 *@date 2017年6月14日  下午4:02:20
 */
public class DmitryRule {
public static void main(String[] args) {
	//以前的实现方式 有何不妥?
	//总公司领导直接接触分公司员工了!! 没发现?
	/*
	 * List<Emp> emps2 = branchOfficeLeader.getEmps();
	 *	for (Emp e : emps2) {
	 *		System.out.println(e);
	 * 	}
	 */
	HeadOfficeLeader headOfficeLeader = new HeadOfficeLeader();
	BranchOfficeLeader branchOfficeLeader = new BranchOfficeLeader();
	headOfficeLeader.payOff(branchOfficeLeader);
	
	
	/**
	 * 正确的打开方式应该是这样的
	 * 
	 * 
	 * HeadOfficeLeader2 他的payoff方法中没有直接接触分公司员工 而是让分公司领导直接接触分公司员工 
	 * 这才是正确的打开方式 总公司领导避免了与分公司员工的直接接触 而是通过中介(分公司领导)来接触
	 * 
	 */
	HeadOfficeLeader2 headOfficeLeader2 = new HeadOfficeLeader2();
	BranchOfficeLeader branchOfficeLeader2 = new BranchOfficeLeader();
	headOfficeLeader2.payOff(branchOfficeLeader2);
	
	}
}

/*
 * 总公司领导
 */
class HeadOfficeLeader{
	List<Emp> emps = new ArrayList<Emp>();
	public List<Emp> getEmps(){
		//总公司有200员工
		for (int i = 0; i <200; i++) {
			Emp emp = new Emp();
			emp.setNo("总公司_"+i);
			emp.setName("刘"+i);
			emp.setSalary(5600+i);
			emps.add(emp);
		}
		return emps;
	}
	public void payOff(BranchOfficeLeader branchOfficeLeader){
		List<Emp> emps = getEmps();
		for (Emp e : emps) {
			System.out.println(e);
		}
		List<Emp> emps2 = branchOfficeLeader.getEmps();
		for (Emp e : emps2) {
			System.out.println(e);
		}
	}
}

/*
 * 总公司领导666
 */
class HeadOfficeLeader2{
	List<Emp> emps = new ArrayList<Emp>();
	public List<Emp> getEmps(){
		//总公司有200员工
		for (int i = 0; i <200; i++) {
			Emp emp = new Emp();
			emp.setNo("总公司_"+i);
			emp.setName("刘"+i);
			emp.setSalary(5600+i);
			emps.add(emp);
		}
		return emps;
	}
	public void payOff(BranchOfficeLeader branchOfficeLeader){
		List<Emp> emps = getEmps();
		for (Emp e : emps) {
			System.out.println(e);
		}
		//分公司领导直接给分公司员工发工资 
		branchOfficeLeader.payOff();
	}
}
/*
 * 分公司领导
 */
class BranchOfficeLeader{
	List<Emp> emps = new ArrayList<Emp>();
	public List<Emp> getEmps(){
		//总公司有200员工
		for (int i = 0; i <200; i++) {
			Emp emp = new Emp();
			emp.setNo("分公司_"+i);
			emp.setName("李"+i);
			emp.setSalary(8000+i);
			emps.add(emp);
		}
		return emps;
	}
	public void payOff(){
		List<Emp> emps = getEmps();
		for (Emp e : emps) {
			System.out.println(e);
		}
	}
}






/*
 * 员工类 不管是总公司还是分公司 员工就是员工 公用一个类 id用分公司_xxx 总公司_xxx来表示
 */
class Emp{
	private String no;
	private String name;
	private double salary;
	public String getNo() {
		return no;
	}
	public void setNo(String no) {
		this.no = no;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getSalary() {
		return salary;
	}
	public void setSalary(double salary) {
		this.salary = salary;
	}
	
	@Override
	public String toString() {
		return "编号:"+this.no +"  姓名:"+this.name+"  薪水:"+this.salary;
	}
}


标签:11,分公司,米特,法则,总公司,List,员工,emps,public
来源: https://blog.51cto.com/u_12198094/2700005