设计模式是为了让程序(软件),具有更好代码重用性,可读性,可扩展性,可靠性。使程序呈现高内聚,低耦合的特性。
设计模式原则,其实就是程序员在编程时,应当遵守的原则,也是各种设计模式的基础(即: 设计模式为什么这样设计的依据)
一个类应该只负责一项职责,如实体类,实体类中不应进行其他业务操作。
举例,比如在一个绘图系统中,定义一个矩形类,类中包含了长、宽,同时定义了一个绘制矩形的方法,在这个方法中难免要使用到GUI库的引用,这会导致程序在加载矩形类的时候也消耗链接、编译时间、内存空间和存储空间等。其次在绘制矩阵方法中,绘制方法中可能用到自定义的绘制方法,当有需求要更改自定义的绘制方法时,就强制要求将矩形类也要重新编译,测试及部署。
职责的统一需要根据业务和需求来判断,识别出同一种类型的职责,这也是比较难的一点。
一个类对另一个类的依赖应该建立在最小的接口。
当一个类依赖于某个接口的部分方法,而不是全部方法时,应考虑将接口拆分,而不是增加多余的空实现。
依赖倒转(倒置)的中心思想是:面向接口编程,比如接收信息,只依赖于接收信息接口,在后续增加接收信息的方式时,调用方无需修改代码即可无缝衔接
依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在 java 中,抽象指的是接口或抽象类,细节就是具体的实现类
问题提出:在编程中,如何正确的使用继承? => 里氏替换原则
继承包含这样一层含义:父类中凡是已经实现好的方法,实际上是在设定规范和契约,虽然它不强制要求所有的子类必须遵循这些契约,但是如果子类对这些已经实现的方法任意修改,就会对整个继承体系造成破坏。
继承在给程序设计带来便利的同时,也带来了弊端。比如使用继承会给程序带来侵入性,程序的可移植性降低,增加对象间的耦合性,如果一个类被其他的类所继承,则当这个类需要修改时,必须考虑到所有的子类,并且父类修改后,所有涉及到子类的功能都有可能产生故障。
开闭原则(Open Closed Principle)是编程中最基础、最重要的设计原则
迪米特法有个简单的定义:只与直接的朋友通信
直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖,关联,组合,聚合等。其中,我们称出现成员变量,方法参数,方法返回值中的类为直接的朋友,而出现在局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变量的形式出现在类的内部。
原则是尽量使用组合/聚合的方式,而不是使用继承
Uml图种类:
针对于设计模式,必须先弄懂类图:
只要是在类中用到了对方,那么他们之间就存在依赖关系。如果没有对方,连编绎都通过不了
public class PersonServiceBean {
private PersonDao personDao;
public void save(Person person){}
public IDCard getIDCard(Integer personid){}
public void modify(){
Department department = new Department();
}
}
对应关系:虚线普通箭头
泛化关系实际上就是继承关系,它是依赖关系的特例
public class PersonServiceBean extends Daosupport{
}
对应关系:实线空心箭头指向类
实现关系实际上就是 A 类实现 B 接口,它是依赖关系的特例
public class PersonServiceBean implements PersonService {
public void delete(Interger id){}
}
对应关系:虚线空心箭头指向接口
类与类之间的联系,它是依赖关系的特例
关联具有导航性:即双向关系或单向关系
关联具有多重性:如“1”对“多”,“多”对“多”
单向 1 对 1 关联关系:
public class Person {
private IDCard card;
}
双向 1 对 1 关联关系:
public class Person {
private IDCard card;
}
// 另一个文件
public class IDCard{
private Person person;
}
对应图:
聚合关系(Aggregation)表示的是整体和部分的关系,整体与部分可以分开。聚合关系是关联关系的特例,所以他具有关联的导航性与多重性。
如:一台电脑由键盘(keyboard)、显示器(monitor),鼠标等组成;组成电脑的各个配件是可以从电脑上分离出来的,使用带空心菱形的实线来表示:
public class Computer{
private Mouse mouse;
private Monitor monitor;
public void setMouse(Mouse mouse) {
this.mouse = mouse;
}
public void setMonitor(Monitor monitor) {
this.monitor = monitor;
}
}
组合关系:也是整体与部分的关系,但是整体与部分不可以分开。用实心菱形表示。
如果我们认为上面Mouse,Monitor和Computer是不可分离的,则升级为组合关系。
public class Computer{
private Mouse mouse = new Mouse();
private Monitor monitor = new Monitor();
}
再看一个案例:在程序中我们定义实体:Person 与 IDCard、Head, 那么 Head 和 Person 就是 组合,IDCard 和Person 就是聚合。
但是如果在程序中 Person 实体中定义了对 IDCard 进行级联删除,即删除 Person 时连同 IDCard 一起删除,那么 IDCard 和 Person 就是组合了。
public class Person{
private IDCard card;
private Head head = new Head();
}
可以分为三大类:
创建型模式(Creational Patterns):这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。
结构型模式(Structural Patterns):这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。
行为型模式(Behavioral Patterns):这些设计模式特别关注对象之间的通信
设计模式之间的关系:
https://baijiahao.baidu.com/s?id=1757590341900686107&wfr=spider&for=pc