学习这个设计模式 真的觉得很抽象,只有自己多多的领会!
在很多时候,很多的知识都会觉得讲起来是很矛盾的。
本章目标
1 掌握内聚度和耦合度的概念
2 掌握面向对象设计原则
(一)如何衡量软件设计的质量
内聚度:表示一个应用程序的单个单元所负责的任务数量和多样性。内聚与单个类或者单个方法单元相关。(在我自己的理解就是:在一个类中完成自己所有的任务,这些任务都在自己的类中。自己的事情自己做)
耦合度:耦合度表示类之间关系的紧密程度。耦合度决定了变更一个应用程序的容易程度。在紧密耦合的类结构中,更改一个类会导致其它的类也随之需要做出修改。
设计原则:
“高内聚 低耦合”是
在设计时遵循的一定的设计原则:
1
设计原则名称 |
设计原则简介 |
重要性 |
单一职责原则 |
类的职责要单一,不能将太多的职责放在一个类中。 |
★★★★☆ |
开闭原则 |
软件实体对扩展是开放的,但对修改是关闭的,即在不修改一个软件实体的基础上去扩展其功能。 |
★★★★★ |
里氏替换原则 |
在软件系统中,一个可以接受基类对象的地方必然可以接受一个子类对象。 |
★★★★☆ |
依赖倒转原则 |
要针对抽象层编程,而不要针对具体类编程。 |
★★★★★ |
接口隔离原则 |
使用多个专门的接口来取代一个统一的接口。 |
★★☆☆☆ |
组合/聚合复用原则 |
在系统中应该尽量多使用组合和聚合关联关系,尽量少使用甚至不使用继承关系。 |
★★★★☆ |
迪米特法则 |
一个软件实体对其他实体的引用越少越好,或者说如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,而是通过引入一个第三者发生间接交互。 |
★★★☆☆ |
一: 单一职责原则:
开闭原则是核心:开闭原则是面向对象设计的核心所在。遵循这个原则可以带来灵活性、可重用性和可维护性。
其它设计原则(里氏替换原则、依赖倒转原则、组合/聚合复用原则、迪米特法则、接口隔离原则)是实现开闭原则的手段和工具。
OOAD理论的知识很多,实践的比较少的。理解起来呢 真的比较抽象的,有些时候讲的知识也感觉是矛盾的。
1 package com.lovo.chap2; 2 /** 3 * 长方形 父类 4 * @author acer 5 * 6 */ 7 public class Rectangle { 8 private int width; 9 private int height; 10 11 public int getWidth() { 12 return width; 13 } 14 public void setWidth(int width) { 15 this.width = width; 16 } 17 public int getHeight() { 18 return height; 19 } 20 public void setHeight(int height) { 21 this.height = height; 22 } 23 24 25 }
1 package com.lovo.chap2; 2 /** 3 * 正方形继承长方形 4 * @author acer 5 * 6 */ 7 public class Square extends Rectangle { 8 @Override 9 public void setHeight(int height) { 10 super.setHeight(height); 11 super.setWidth(height); 12 } 13 14 }
1 package com.lovo.chap2; 2 3 public class test { 4 public void design(Rectangle rc){ 5 while(rc.getHeight()<=rc.getWidth()){//这里为什么还要用等于呢 6 System.out.println(rc.getHeight()); 7 rc.setHeight(rc.getHeight()+1); 8 9 } 10 11 } 12 public static void main(String[] args) { 13 test t=new test(); 14 Rectangle re=new Rectangle(); 15 re.setHeight(50); 16 re.setWidth(100); 17 t.design(re); 18 19 Square s=new Square(); 20 s.setHeight(200); 21 t.design(s); 22 23 } 24 25 }
动作正确性保证:符合里氏代换原则的类扩展不会给已有的系统引入新的错误。
1 package com.lovo.dip; 2 3 public interface Study { 4 public void read(); 5 6 }
1 package com.lovo.dip; 2 /** 3 * 读书 4 * @author acer 5 * 6 */ 7 public class ReadBooks implements Study { 8 9 @Override 10 public void read() { 11 System.out.println("读书学习"); 12 } 13 14 }
1 package com.lovo.dip; 2 /** 3 * 报纸 4 * @author acer 5 * 6 */ 7 public class ReadPaper implements Study { 8 9 @Override 10 public void read() { 11 System.out.println("读报纸学习"); 12 } 13 14 }
1 package com.lovo.dip; 2 /** 3 * 网页 4 * @author acer 5 * 6 */ 7 public class Online implements Study { 8 9 @Override 10 public void read() { 11 System.out.println("网页学习!"); 12 } 13 14 }
1 package com.lovo.dip; 2 3 public class StudyMethods { 4 5 public void read(Study s) { 6 s.read(); 7 } 8 9 }
1 package com.lovo.dip; 2 /** 3 * 4 * dip 依赖倒转原则 5 * @author acer 6 * 7 */ 8 public class Test { 9 10 public static void main(String[] args) { 11 StudyMethods st=new StudyMethods(); 12 st.read(new ReadPaper()); 13 //st.read(new ReadBooks()); 14 //st.read(new Online()); 15 16 17 } 18 19 }