11.迪米特法则

来源:互联网 发布:云计算 大数据 编辑:程序博客网 时间:2024/06/04 00:37
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;}@Overridepublic String toString() {return "编号:"+this.no +"  姓名:"+this.name+"  薪水:"+this.salary;}}

原创粉丝点击