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

Posted 巷子里的旧少年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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设计模式--迪米特原则的主要内容,如果未能解决你的问题,请参考以下文章

23种设计模式在Android中的应用

设计模式六大原则:迪米特法则

设计模式软件设计七大原则 ( 迪米特原则 | 代码示例 )

设计模式—— 五:迪米特原则

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

设计模式七大原则——迪米特原则