java设计模式
gitee地址: https://gitee.com/zhumiao9527/java_design_patterns
参考文章地址: http://www.uml.org.cn/sjms/201211023.asp#1
设计模式的7大原则
1开闭原则
定义:一个软件实体如类,模块,方法应该对扩展开放,对修改关闭
2依赖倒置原则
定义: 高层模块不应该依赖底层模块,二者都应依赖其抽象,抽象不应该依赖细节,细节应该依赖抽象
1 场景是这样的,母亲给孩子讲故事,只要给她一本书,她就可以照着书给孩子讲故事了。代码如下: 2 class Book{ 3 public String getContent(){ 4 return "很久很久以前有一个阿拉伯的故事……"; 5 } 6 } 7 8 class Mother{ 9 public void narrate(Book book){ 10 System.out.println("妈妈开始讲故事"); 11 System.out.println(book.getContent()); 12 } 13 } 14 15 public class Client{ 16 public static void main(String[] args){ 17 Mother mother = new Mother(); 18 mother.narrate(new Book()); 19 } 20 } 21 运行结果: 22 妈妈开始讲故事 23 很久很久以前有一个阿拉伯的故事…… 24 运行良好,假如有一天,需求变成这样:不是给书而是给一份报纸,让这位母亲讲一下报纸上的故事,报纸的代码如下: 25 class Newspaper{ 26 public String getContent(){ 27 return "林书豪38+7领导尼克斯击败湖人……"; 28 } 29 } 30 这位母亲却办不到,因为她居然不会读报纸上的故事,这太荒唐了,只是将书换成报纸,居然必须要修改Mother才能读。假如以后需求换成杂志呢?换成网页呢?还要不断地修改Mother,这显然不是好的设计。原因就是Mother与Book之间的耦合性太高了,必须降低他们之间的耦合度才行。 31 我们引入一个抽象的接口IReader。读物,只要是带字的都属于读物: 32 interface IReader{ 33 public String getContent(); 34 } 35 36 class Newspaper implements IReader { 37 public String getContent(){ 38 return "林书豪17+9助尼克斯击败老鹰……"; 39 } 40 } 41 class Book implements IReader{ 42 public String getContent(){ 43 return "很久很久以前有一个阿拉伯的故事……"; 44 } 45 } 46 47 class Mother{ 48 public void narrate(IReader reader){ 49 System.out.println("妈妈开始讲故事"); 50 System.out.println(reader.getContent()); 51 } 52 } 53 54 public class Client{ 55 public static void main(String[] args){ 56 Mother mother = new Mother(); 57 mother.narrate(new Book()); 58 mother.narrate(new Newspaper()); 59 } 60 } 61 运行结果: 62 妈妈开始讲故事 63 很久很久以前有一个阿拉伯的故事…… 64 妈妈开始讲故事 65 林书豪17+9助尼克斯击败老鹰……
3单一职责原则
定义: 一个类负责一个指责,不要存在多与一个倒置类变更的原因。实际应用可能会很复杂,可能只能做到方法的单一职责。总之尽量遵守比较好。
4接口隔离原则
定义: 客户端不应该依赖它不需要的接口,一个类对于另一个类的依赖应该建立在最小的接口上。比如接口里面有两个方法,那么实现类也必须实现两个方法,但是依赖这个实现类的客户端,只是需要一个这样的方法,所以造成了浪费,最好将接口拆分,这样就做到了接口隔离。
5迪米特法则
定义: 一个对象应该对其他对象保持最少的了解
6里氏替换原则
7合成复用原则
zhumiao