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

迪米特原则英文名称(Law of Demeter),缩写LOD,也成为最少只是原则。虽然名字不同,但描述的是同一个原则:一个对象应该对其他对象有最少的了解,通俗的讲,一个类应该对自己学要耦合或调用的类知道的最少,类的内部结构如何实现与调用者或者依赖者没有关系。调用或者依赖者只需要知道它需要的方法即可。其他一概不管,类与类之间的关系密切,耦合度越大,当一个类发生改变时,对另一个类的影响越大。

下面我们就以租房为例,来讲讲迪米特原则的应用
在外漂泊的朋友应该比较了解,在外面租房子的时候大多数都是通过中介找房,我们设定的情况为:我们只要求房间的大小和租金,其他一概不管中介将符合我要求的房子提供给我就可以了。看下面这个示例:
/** * 房间 */
public class Room {

    public float area;

    public float prcie;

    public float getArea() {
        return area;
    }

    public void setArea(float area) {
        this.area = area;
    }

    public float getPrcie() {
        return prcie;
    }

    public void setPrcie(float prcie) {
        this.prcie = prcie;
    }
}
/** * 中介 */
public class Mediator {
    List<Room> mRooms=new ArrayList<>();

    public Mediator(){
        for (int i=0;i<5;i++){
            Room room=new Room();
            room.setArea(14+i);
            room.setPrcie(14+i*150);
            mRooms.add(room);
        }
    }

/** *租户 */
public class Tenant {

    public float roomArea;
    public float roomPrice;
    public static final float diffPrice = 100.0f;
    public static final float diffArea = 0.00f;

    public void rentRoom(Mediator mediator) {
        List<Room> rooms = mediator.getAllRooms();
        for (Room room:rooms){
            if (isSuitable(room)){
                Log.i("Tenant","room----"+room);
                break;
            }

        }

    }

    private boolean isSuitable(Room room){
        return Math.abs(room.getPrcie()roomPrice<diffPrice
        &&Math.abs(room.getArea()-roomArea)<diffArea;
    }
}

从上面代码可以看到,Tenant不仅依赖了Mediatior类,还需要频繁的与Room类打交道。租户类的要求只是通过中介找到一间适合自己的房间罢了,如果把这些检测条件放在Tenant类中,那么中介类的功能就弱化了,而且导致Tenant与Room的耦合较高,因为Tenant必须知道许多关于Room的细节。当Room变化是Tenant也必须跟着变化。Tenant又与Mediatior耦合,这就出现了纠缠不清的关系。这个时候就需要我们分清谁才是我们真正的“朋友”在我们设定的情况下显然是Mediator(虽然显示生活中不是这样的)。

既然是耦合太严重,那么我们就只能解偶了。首先要明确的是,我们只和我们的朋友通信,这里就是指Mediator对象。必须将Room相关操作从Tenant中移除,而这些操作属于Mediator。进行如下重构

/** * 中介 */
public class Mediator {
    List<Room> mRooms=new ArrayList<>();

    public Mediator(){
        for (int i=0;i<5;i++){
            Room room=new Room();
            room.setArea(14+i);
            room.setPrcie(14+i*150);
            mRooms.add(room);
        }
    }

  public Room rentOut(float area,float price){

     for(Room room:mRooms){
       if(isSuitable(area,prcie,room)){
         return room;
        }
        return null;
      }

   }
  }

  private boolean isSuitable(float area,float price,Room room){
        return Math.abs(room.getPrcie()-price<Tenant.diffPrice
        &&Math.abs(room.getArea()-area)<Tenant.diffArea;
    }
/** *租户 */
public class Tenant {

    public float roomArea;
    public float roomPrice;
    public static final float diffPrice = 100.0f;
    public static final float diffArea = 0.00f;


    private void rentRoom(Mediatior mediatior){
        Log.i("Tenant","租到房啦"+mediatior.rentOut(roomArea,roomPrice));
    }
}

只是将对于Room的判定操作移动到了Mediator类中,这本应该是Mediator的职责,根据租户设定的条件查找符合要求的房子,并且将结果交给租户就可以了。租户不需要知道太多Room的细节。

你可能感兴趣的:(设计模式,android)