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