Android设计模式之迪米特原则

Posted 懂你的大海

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android设计模式之迪米特原则相关的知识,希望对你有一定的参考价值。

一、定义

迪米特原则(LODLaw 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设计模式之迪米特原则的主要内容,如果未能解决你的问题,请参考以下文章

[5分钟]菜鸟修研之设计模式:六大设计原则

学习设计模式 - 六大基本原则之迪米特法则

设计模式六大原则/接口设计六大原则 之 迪米特法则(转)

设计模式 - 六大设计原则之LoD(迪米特法则原则)

设计模式 - 六大设计原则之LoD(迪米特法则原则)

Android设计模式--迪米特原则