1 设计模式原则
1.1 单一职责原则
一个类只负责一项职责。有时当类的方法较少,可以在方法级别上体现单一职责原则。
1.2 接口隔离原则
一个类对另外一个类的依赖应该是建立在"最小"的接口上。
比如接口Interface有5个方法,B类和D类实现该接口。A类通过接口依赖B,但只会使用1,2,3这三个方法;C类通过接口依赖D,但只会使用1,4,5这三个方法。
这时根据原则应该把接口Interface拆成三个子接口InterfaceA,InterfaceB和InterfaceC。
-
InterfaceA只有1方法
-
InterfaceB只有2和3方法
-
InterfaceC只有4和5方法
然后B类实现InterfaceA和InterfaceB,D类实现InterfaceA和InterfaceC。
1.3 依赖倒转原则
- 高层模块不应该依赖底层模块,两者应该依赖抽象
- 细节依赖抽象
- 该原则的中心思想是面向接口编程
1.3.1 例子
public interface Message {
void getInfo();
}
public class Email implements Message {
@Override
public void getInfo() {
System.out.println("收到邮件了");
}
}
public class People {
// receive方法的参数不应该是具体的Email类。
// 将来可能扩充QQ类,微信类等,这些类只要实现了Message接口,那么该方法也适用
public void receive(Message m) {
m.getInfo();
}
public static void main(String[] args) {
People p = new People();
p.receive(new Email());
}
}
1.3.2 实现的方式
-
通过传递接口实现依赖,如上述例子
-
通过构造方法传递依赖
interface IOpenAndClose { void open(); } interface ITV { void play(); } class OpenAndClose implements IOpenAndClose{ private ITV tv; public OpenAndClose(ITV tv) { this.tv = tv; } @Override public open() { this.tv.play(); } } -
通过set方法传递依赖
1.4 里氏替换原则
-
引用父类的地方必须能透明地使用其子类的对象,子类不能在父类会的东西上进行"创新"
-
子类尽量不要重写父类的方法
-
进行设计的时候,尽量从抽象类继承,而不是从具体类继承
1.5 开闭原则(OCP)
- 模块和函数对扩展开发(提供发),对修改关闭(使用方)
- 用抽象构建框架,用实现扩展细节
- 当软件需要变化时,尽量通过扩展来实现变化,而非修改已有代码来实现变化
- 遵循其他原则的目的就是为了实现开闭原则
1.6 迪米特法则
-
一个类应该对自己需要耦合或调用的类知道的最少,所以又称最少知道原则
-
只与朋友类交流,尽量不与陌生类交流
出现在成员变量、方法的参数、方法返回值中的类称为朋友类,如果方法返回值是集合,集合中的泛型类也算朋友类。而出现在方法里的局部变量不属于朋友类。
-
类间public方法不能肆无忌惮的暴露
-
该法则的核心是降低类间的耦合关系
1.7 合成/聚合复用原则
在软件复用时,要尽量先使用组合或者聚合关系来实现,其次才考虑使用继承关系来实现。
2 UML类图
-
矩形框的第一行为类名,斜体字则为抽象类;第二行为属性;第三行为方法。'+'表示public;'-'表示private;'#'表示protected
-
顶端写着《interface》或者矩形框上有"棒棒糖",则表示接口
-
常见关系如下所示
关系 画图 解释 画图方向 继承 实线+空心三角形 子类指向父类 实现 虚线+空心三角形 实现类指向接口 依赖 虚线+箭头 使用关系;代码体现在局部变量、方法参数、静态方法的调用 指向被使用者 关联 实线+箭头 拥有关系;A类拥有B类属性,则A类关联B类;代码体现在成员变量 A类关联B类,则A指向B 聚合 空心菱形+实线+箭头 弱"拥有"关系;整体与部分的关系,且部分离开整体可以单独存在。比如车子和轮胎,轮胎离开车子依然可以存在 空心菱形在整体那边,箭头在部分那边 合成/组合 实心菱形+实线+箭头 强"拥有"关系;整体与部分的关系,但部分不能离开整体单独存在,部分与整体的生命周期相同。比如鸟和翅膀 实心菱形在整体那边,箭头在部分那边 -
耦合度:依赖 < 关联 < 聚合 < 合成/组合
例图如下所示(出自《大话设计模式》)