迪米特原则 (Law of Demeter LoD)是指一个对象应该对其他对象保持最少的了解,又叫最少
知道原则 (Least Knowledge Principle, LKP ),尽量降低类与类之间的精合度。迪米特原则主要
强调 只和朋友交流,不和陌生人说话。出现在成员变量、方法的输入、输出参数中的类都可以
称为成员朋友类,而出现在方法体内部的类不属于朋友类。
1.代表自己的接口
public class Me {
public void talk(){
System.out.println("我出去交流说");
}
}
2.代表陌生人的类
public class Stranger {
public void talk(){
System.out.println("陌生人出去交流说");
}
}
3.朋友类
public class Friend {
public void talk(Me me){
me.talk();
System.out.println("淡黄色的长裙");
}
public void talk(Stranger stranger){
stranger.talk();
System.out.println("蓬松的头发");
}
}
4.调用
public class TalkTest {
public static void main(String [] args){
Friend friend = new Friend();
friend.talk(new Me());
friend.talk(new Stranger());
}
}
根据迪米特原则 我和陌生人是不能对话的 (我得通过我的朋友才能接触到牛姐的RAP)所以我们改造一下
5.我
public class Me {
private Friend friend;
private Stranger stranger;
public void talk(){
System.out.println("我说淡黄的长裙");
friend.talk();
stranger.talk();
}
public Friend getFriend() {
return friend;
}
public void setFriend(Friend friend) {
this.friend = friend;
}
public Stranger getStranger() {
return stranger;
}
public void setStranger(Stranger stranger) {
this.stranger = stranger;
}
}
6.朋友
public class Friend {
public void talk(){
System.out.println("朋友说蓬松的头发");
}
}
7.陌生人抽象类
public abstract class Stranger {
protected abstract void talk();
}
7.实际陌生人
public class StrangerC extends Stranger{
@Override
protected void talk() {
System.out.println("陌生人回应说就当作是一场梦,醒了还是会感动");
}
}
7.调用
public class TalkTest {
public static void main(String [] args){
Me me = new Me();
me.setFriend(new Friend());
me.setStranger(new StrangerC());
me.talk();
}
}
也可以通过依赖倒转原则,让高层与底层都依赖于抽象,让某人与抽象陌生人进行交互.
8.我
public class Me {
private Friend friend;
public void talk(){
System.out.println("我说淡黄的长裙");
friend.talk();
}
public Friend getFriend() {
return friend;
}
public void setFriend(Friend friend) {
this.friend = friend;
}
}
9.朋友
public class Friend {
public void talk(){
System.out.println("朋友说蓬松的头发");
}
// 朋友与陌生人交流
public void talkWithStranger(){
Stranger stranger = new Stranger();
stranger.talk();
}
}
10.陌生人
public class Stranger {
public void talk(){
System.out.println("陌生人回应说就当作是一场梦,醒了还是会感动");
}
}
11.调用
public class TalkTest {
public static void main(String [] args){
Me me = new Me();
me.setFriend(new Friend());
me.talk();
me.getFriend().talkWithStranger();
}
}