S-6-迪米特法则

一、定义

迪米特法则(Law of Demeter)又叫作最少知识原则(The Least Knowledge Principle),一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解,只和朋友通信,不和陌生人说话。英文简写为: LOD。

二、案例

①、

/**
 * @author 作者 ki16:
 * @version 创建时间:2021年7月23日 下午3:39:03
 *
 */

public class LOD {
    public static void main(String[] args) {
        //海绵宝宝<--->章鱼哥<--->派大星
        
        //海绵宝宝找章鱼哥
        Spongebob spongebob = new Spongebob();
        System.out.println(spongebob.play(new OctopusBrother()));
        
        //章鱼哥找派大星
        System.out.println(new OctopusBrother().playWithPatrickStar()); 
    }
}

//海绵宝宝
class Spongebob{public String play(OctopusBrother octopusBrother) {
        return octopusBrother.play();
    }
}

//章鱼哥
class OctopusBrother{
    public String play(){
        return "章鱼哥";
    }
    public String playWithPatrickStar(){
        PatrickStar patrickStar = new PatrickStar();
        return patrickStar.play();
    }
    
}

//派大星
class PatrickStar{
    public String play() {
        return "派大星";
    }
}

②、与依赖倒转原则结合

 

/**
 * @author 作者 ki16:
 * @version 创建时间:2021年7月23日 下午3:39:03
 *
 */

public class LOD {
    public static void main(String[] args) {
                Spongebob spongebob = new Spongebob();
                spongebob.setOctopusBrother(new OctopusBrother());
                System.out.println(spongebob.play(OctopusBrother.class));
                
                
                spongebob.setCrabBoos(new PatrickStar());
                System.out.println(spongebob.play(CrabBoos.class));
                
                
    }
}

//海绵宝宝
class Spongebob{
    private OctopusBrother octopusBrother;
    private CrabBoos crabBoos;
    
    public OctopusBrother getOctopusBrother() {
        return octopusBrother;
    }
    public void setOctopusBrother(OctopusBrother octopusBrother) {
        this.octopusBrother = octopusBrother;
    }
    public CrabBoos getCrabBoos() {
        return crabBoos;
    }
    public void setCrabBoos(CrabBoos crabBoos) {
        this.crabBoos = crabBoos;
    }

    public  <T> String play(Class<T> clazz) {
        String name = clazz.getName();
        System.out.println("name=" + name);
        if ("OctopusBrother".equals(name)) {
            return octopusBrother.play();
        }else if ("CrabBoos".equals(name)) {
            return crabBoos.play();
        }
        return null;
    }
}

//章鱼哥
class OctopusBrother{
    public String play(){
        return "章鱼哥";
    }
}


//蟹老板
abstract class CrabBoos{
    abstract String play();
}


//派大星
class PatrickStar extends CrabBoos{
    @Override
    String play() {
        return "派大星";
    }
}

 

posted @ 2021-07-23 16:20  ki1616  阅读(161)  评论(0编辑  收藏  举报