当前位置:   article > 正文

设计模式—迪米特原则(LOD)_什么设计模式满足迪米特原则

什么设计模式满足迪米特原则

1.背景

1987年秋天由美国Northeastern University的Ian Holland提出,被UML的创始者之一Booch等普及。后来,因为在经典著作《 The Pragmatic Programmer》而广为人知。

2.概念

迪米特法则(Law of Demeter)又叫作最少知识原则(The Least Knowledge Principle),一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解,只和朋友通信,不和陌生人说话。英文简写为: LOD。

通俗的讲:

  • 不该知道的不要知道;

  • 一个类应该保持对其它对象最少的了解,只和朋友通信,不和陌生人说话;

  • 降低类之间的耦合度;

  • 从依赖者的角度来说,只依赖应该依赖的对象;

  • 从被依赖者的角度说,只暴露应该暴露的方法;

设计原则:

  • 在类的划分上,应该创建弱耦合的类。类与类之间的耦合越弱,就越有利于实现可复用的目标;

  • 在类的结构设计上,尽量降低类成员的访问权限;

  • 在类的设计上,优先考虑将一个类设置成不变类;

  • 在对其他类的引用上,将引用其他对象的次数降到最低;

  • 不暴露类的属性成员,而应该提供相应的访问器(set 和 get 方法);

  • 谨慎使用序列化(Serializable)功能;

3.案例

需求:租客想通过中介找房子,租客想要一个20平、2000一个月的。

方案一(不满足迪米特原则):把所有房源都给租客,租客自己选

  1. /// <summary>
  2. /// 房源
  3. /// </summary>
  4. public class Room
  5. {
  6. private int are;
  7. private int pay;
  8. public int getAre()
  9. {
  10. return are;
  11. }
  12. public void setAre(int are)
  13. {
  14. this.are = are;
  15. }
  16. public int getPay()
  17. {
  18. return pay;
  19. }
  20. public void setPay(int pay)
  21. {
  22. this.pay = pay;
  23. }
  24. }
  25. /// <summary>
  26. /// 中介
  27. /// </summary>
  28. public class Mediator
  29. {
  30. private List<Room> allRooms = new List<Room>();
  31. /// <summary>
  32. /// 初始化房源
  33. /// </summary>
  34. public Mediator()
  35. {
  36. for (int i = 0; i < 10; i++)
  37. {
  38. Room room = new Room();
  39. room.setAre((i + 1) * 5);
  40. room.setPay((i % 4 == 0 ? 1 : i % 4) * 1000);
  41. allRooms.Add(room);
  42. }
  43. }
  44. /// <summary>
  45. /// 获取所有房源
  46. /// </summary>
  47. /// <returns></returns>
  48. public List<Room> GetAllRooms()
  49. {
  50. return allRooms;
  51. }
  52. }
  53. /// <summary>
  54. /// 租客
  55. /// </summary>
  56. public class Tenant
  57. {
  58. public static void RentRoom(Mediator mediator)
  59. {
  60. // 通过中介获取所有房屋
  61. List<Room> allRoom = mediator.GetAllRooms();
  62. foreach(Room room in allRoom)
  63. {
  64. if (IsSuitable(room))
  65. {
  66. Console.WriteLine("房屋找到了");
  67. }
  68. }
  69. }
  70. /// <summary>
  71. /// 判断房子是否满足客户需求
  72. /// </summary>
  73. /// <param name="room"></param>
  74. /// <returns></returns>
  75. private static bool IsSuitable(Room room)
  76. {
  77. // 筛选房屋
  78. return true;
  79. }
  80. }
  81. {
  82. //LOD:迪米特原则
  83. Tenant.RentRoom(new Mediator());
  84. }

代码分析:

以上的方案是中介直接把所有的房源全部提供给顾客,其中就包含不满足租客条件的房源,这就增加了租客和房源直接的耦合度。

方案二(满足迪米特原则):先按照要求把房源筛选出来,给租客

  1. /// <summary>
  2. /// 房源
  3. /// </summary>
  4. public class Room
  5. {
  6. private int are;
  7. private int pay;
  8. public int getAre()
  9. {
  10. return are;
  11. }
  12. public void setAre(int are)
  13. {
  14. this.are = are;
  15. }
  16. public int getPay()
  17. {
  18. return pay;
  19. }
  20. public void setPay(int pay)
  21. {
  22. this.pay = pay;
  23. }
  24. }
  25. /// <summary>
  26. /// 中介
  27. /// </summary>
  28. public class MediatorLOD
  29. {
  30. private List<Room> allRooms = new List<Room>();
  31. public MediatorLOD()
  32. {
  33. for (int i = 0; i < 10; i++)
  34. {
  35. Room room = new Room();
  36. room.setAre((i + 1) * 5);
  37. room.setPay((i % 4 == 0 ? 1 : i % 4) * 1000);
  38. allRooms.Add(room);
  39. }
  40. }
  41. /// <summary>
  42. /// 找出符合租客要求的房子
  43. /// </summary>
  44. /// <param name="are"></param>
  45. /// <param name="pay"></param>
  46. /// <returns></returns>
  47. public Room RentRoom(int are, int pay)
  48. {
  49. // 通过中介获取所有房屋
  50. foreach(Room room in allRooms)
  51. {
  52. if (IsSuitable(room, are, pay))
  53. {
  54. return room;
  55. }
  56. }
  57. return null;
  58. }
  59. /// <summary>
  60. /// 判断房源是否满足客户的要求
  61. /// </summary>
  62. /// <param name="room"></param>
  63. /// <param name="are"></param>
  64. /// <param name="pay"></param>
  65. /// <returns></returns>
  66. private bool IsSuitable(Room room, int are, int pay)
  67. {
  68. // 筛选房屋
  69. return true;
  70. }
  71. }
  72. /// <summary>
  73. /// 租客
  74. /// </summary>
  75. public class TenantLOD
  76. {
  77. /// <summary>
  78. /// 获取满足条件的房源
  79. /// </summary>
  80. /// <param name="mediator"></param>
  81. public static void RentRoom(MediatorLOD mediator)
  82. {
  83. Console.WriteLine(mediator.RentRoom(20, 2000));
  84. }
  85. }
  86. {
  87. //LOD:迪米特原则
  88. Tenant.RentRoom(new Mediator());
  89. }

代码分析:

相比方案一,当前方案把筛选的过程放到了租客能联系到的中介身上,中介处理房源,而租客和房源的联系微乎其微,这就利用了LOD 原则,降低了租客和房源的耦合度,租客只看到符合条件的房源就可以了。

4.优缺点

优点:

  • 降低了类之间的耦合度,使类与类之间保持松散的耦合关系;

  • 由于耦合度降低,提高了模块的相对独立性;

  • 提高类的可复用性和系统的扩展性;

缺点:

  • 迪米特法则是一种面向对象系统设计风格的一种法则,尤其适合做大型复杂系统设计指导原则。但是也会造成系统的不同模块之间的通信效率降低,使系统的不同模块之间不容易协调等。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号