设计模式分类三种类型,共23种
1.创建型模式:单例模式,工厂模式,抽象工厂模式,原型模式,建造者模式 5种
2.结构型模式:代理模式,装饰模式,适配器模式,桥接模式,组合模式,外观模式,享元模式 7种
3.行为型模式:观察者模式,模板方法模式,命令模式,访问者模式,迭代器模式,中介者模式,
策略模式,备忘录模式,解释器模式,状态模式,责任链模式 11种
不同书对分类和名称有差别
设计模式目的
- 提高代码可用性:相同功能的代码,不用多次编写
- 可读性:编程规范性
- 可扩展性:当需要增加新的功能时,非常方便
- 可靠性:增加新的功能后,对原来的功能没有影响
- 使程序高内聚、低耦合
常用的七大原则
1.单一职责原则:各司其职,一个类只负责一项职责
- 拆分多个类 ,成本高
- 拆分多个方法
2.接口隔离原则
客户端不应该依赖它不需要的接口,即一个类对另外一个 类的依赖应该建立在最小的接口上.
拆分接口到不同的接口
3.依赖倒转(倒置)原则 - 高层不应该依赖底层
- 抽象不应该依赖细节
- 面向接口编程
依赖关系传递的三种方式
- 接口传递
- 构造方法传递
- setter 方法传递
4.里氏替换原则
在使用继承时,子类尽量不要重写父类的方法
新建一个基类,让原来的父类和子类都继承这个基类,采用依赖、
聚合、组合的方式来解决问题
5.开闭原则
一个软件实体如类、模块和函数应该对扩展开放,对修改关闭,用抽象构造框架,用实现扩展细节
通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化
代码实现
package test.design;
/**
* @author fj
* @version 1.0
* @date 2020/11/14 22:38
*/
public class OcpTest {
public static void main(String[] args) {
GraphicEditor graphicEditor = new GraphicEditor();
graphicEditor.drawShape(new Rectangle());
graphicEditor.drawShape(new Circle());
graphicEditor.drawShape(new Triangle());
}
}
/**
* 使用方
*/
class GraphicEditor{
public void drawShape(Shape s){
s.draw();
}
}
/**
* 基类
*/
abstract class Shape{
int type;
/**
* 抽象方法
*/
public abstract void draw();
}
class Rectangle extends Shape{
Rectangle(){
super.type =1;
}
@Override
public void draw() {
System.out.println("绘制矩形");
}
}
class Circle extends Shape{
Circle(){
super.type =2;
}
@Override
public void draw() {
System.out.println("绘制圆形");
}
}
class Triangle extends Shape{
Triangle(){
super.type =3;
}
@Override
public void draw() {
System.out.println("绘制三角形");
}
}
在画其他图形时不用在加类和判断,只需新增类继承即可。
6.迪米特法则 - 最少知道原则
- 一个对象对其他对象了解最少
- 类与类关系越密切,耦合度越大
- 只与直接的朋友通信(有依赖关系的类)
7.合成复用原则