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