Android设计模式之迪米特原则
Posted 懂你的大海
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android设计模式之迪米特原则相关的知识,希望对你有一定的参考价值。
一、定义
迪米特原则(LOD:Law of Demeter):一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解,只和朋友通信,不和陌生人说话。
二、场景运用
小明去找中介租房,他的原则是:只要求房子的面积和租金,其他一律不管,中介将符合要求的房子给到他就行。
/**
* 租客
*/
public class Tenant {
private static final String TAG = Tenant.class.getSimpleName();
public void rentRoom(double area, double price, Mediator mediator) {
List<Room> rooms = mediator.getRooms();
for (Room room : rooms) {
if (isSuitable(area, price, room)) {
Log.i(TAG, "租到房子了");
break;
}
}
}
private boolean isSuitable(double area, double price, Room room) {
return room.getArea() >= area && room.getPrice() <= price;
}
}
/**
* 中介
*/
public class Mediator {
private final List<Room> rooms = new ArrayList<>();
public Mediator() {
for (int i = 0; i < 5; i++) {
rooms.add(new Room(15 + i, (15 + i) * 150));
}
}
public List<Room> getRooms() {
return rooms;
}
}
/**
* 房子
*/
public class Room {
private final double area;
private final double price;
public Room(double area, double price) {
this.area = area;
this.price = price;
}
public double getArea() {
return area;
}
public double getPrice() {
return price;
}
}
上面代码,Tenant 类依赖了 Mediator 类,还要频繁和 Room 类打交道,如果把检测条件都放在 Tenant 类中,那么 Mediator 类的功能就被弱化了,导致 Tenant 类与 Room 类的耦合度较高。
Tenant 类知道了许多 Room 类的细节,当 Room 类发生变化时,Tenant 类也要跟着变化,这就出现了纠缠不清的关系,谁才是 Tenant 类的朋友,显然是 Mediator 类。
将 Room 相关操作从 Tenant 类中移除,进行重构。
/**
* 租客
*/
public class Tenant {
private static final String TAG = Tenant.class.getSimpleName();
public void rentRoom(double area, double price, Mediator mediator) {
Room room = mediator.rentOut(area, price);
if (room != null) {
Log.i(TAG, "租到房子了");
}
}
}
/**
* 中介
*/
public class Mediator {
private final List<Room> rooms = new ArrayList<>();
public Mediator() {
for (int i = 0; i < 5; i++) {
rooms.add(new Room(15 + i, (15 + i) * 150));
}
}
public Room rentOut(double area, double price) {
for (Room room : rooms) {
if (isSuitable(area, price, room)) {
return room;
}
}
return null;
}
private boolean isSuitable(double area, double price, Room room) {
return room.getArea() >= area && room.getPrice() <= price;
}
}
/**
* 房子
*/
public class Room {
private final double area;
private final double price;
public Room(double area, double price) {
this.area = area;
this.price = price;
}
public double getArea() {
return area;
}
public double getPrice() {
return price;
}
}
将 Room 的判断操作移动到 Mediator 类中,因为这本身就是 Mediator 的职责。“只与直接朋友通信”,这几个字就能够处理这些复杂的关系,使程序耦合度降低。
三、总结
每个类尽量减少对其他类的依赖。
以上是关于Android设计模式之迪米特原则的主要内容,如果未能解决你的问题,请参考以下文章