设计模式的目的
1、代码重用性
2、可读性
3、可扩展性(增加功能时,对原来的功能没有影响)
4、可靠性(增加功能时,对原来的功能没有影响)
5、高内聚,低耦合
单一职责原则
一个类应该只负责一项职责
如:类 A 负责两个不同职责:职责 1,职责 2。
当职责 1 需求变更而改变 A 时,可能造成职责 2 执行错误,所以需要将类 A 的粒度分解为 A1,A2
注意:
- 降低类的复杂度,一个类负责一个职责
- 提高类的可读性
- 降低变更的风险
只有类中方法数量足够少时,可以在方法级别保持单一职责原则
接口隔离的原则
客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上
类A和类C只需要依赖接口1的一部分接口,而不需要实现全部,所以可以将接口 Interface1 拆分为独立的几个接口(这里我们拆分成 3 个接口),类 A 和类 C 分别与他们需要的接口建立依赖关系
依赖倒转原则
1)高层模块不应该依赖底层模块,二者都应该依赖其抽象
2)抽象不应该依赖细节,细节应该依赖抽象
3)核心思想:面向接口编程
三种方式:接口传递,构造方法传递,setter方法传递
里氏替换原则
继承给程序设计带来便利也带来了弊端:
- 使用继承会给程序带来侵入性
- 可移植性降低
- 增加对象间的耦合
- 当这个类要修改时,必须考虑到所有的子类
正确使用继承:
- 使用继承时,在子类中尽量不要重写父类的方法
- 在适当的情况,可以使用聚合,组合,依赖来解决
解决方法:让原来的子类和父类都继承一个更通俗的基类,将原有的继承关系去掉,采用聚合,组合,依赖等关系来代替
开闭原则 (最基础,最重要)
比如一个类,模块和函数一个对扩展开发(对提供方),对修改关闭(对使用方)。
当软件需要变化,尽量通过扩展代码,而不是通过修改已有代码的方法实现
案例:
如果需要增加新的功能,绘制别的图形,需要在使用方处修改代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| public class Ocp { 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) { if (s.m_type == 1) drawRectangle(s); else if (s.m_type == 2) drawCircle(s); else if (s.m_type == 3) drawTriangle(s); } public void drawRectangle(Shape r) { System.out.println(" 绘制矩形 "); } public void drawCircle(Shape r) { System.out.println(" 绘制圆形 "); } public void drawTriangle(Shape r) { System.out.println(" 绘制三角形 "); } }
class Shape { int m_type; } class Rectangle extends Shape { Rectangle() { super.m_type = 1; } } class Circle extends Shape { Circle() { super.m_type = 2; } }
class Triangle extends Shape { Triangle() { super.m_type = 3; } }
|
改进:
创建一个抽象类Shape,提供一个抽象方法drow,然后让子类去继承该抽象方法,重写该抽象方法,当需要增加新的功能的时候,只需要创建一个新的类去继承抽象方法并重写即可,无需对使用方代码进行改动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| public class Ocp { public static void main(String[] args) { GraphicEditor graphicEditor = new GraphicEditor(); graphicEditor.drawShape(new Rectangle()); graphicEditor.drawShape(new Circle()); graphicEditor.drawShape(new Triangle()); graphicEditor.drawShape(new OtherGraphic()); } }
class GraphicEditor { public void drawShape(Shape s) { s.draw(); } }
abstract class Shape { int m_type; public abstract void draw(); } class Rectangle extends Shape { Rectangle() { super.m_type = 1; } @Override public void draw() { System.out.println(" 绘制矩形 "); } }
class Circle extends Shape { Circle() { super.m_type = 2; } @Override public void draw() { System.out.println(" 绘制圆形 "); } }
class Triangle extends Shape { Triangle() { super.m_type = 3; } @Override public void draw() { System.out.println(" 绘制三角形 "); } }
class OtherGraphic extends Shape { OtherGraphic() { super.m_type = 4; } @Override public void draw() { System.out.println(" 绘制其它图形 "); } }
|
迪米特法则 (最少知道原则)
一个对象应该对其他对象保持最少的了解
每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,则这两个对象之间是朋友关系
其中,出现成员变量,方法参数,方法返回值中的类为直接的朋友
迪米特法则只要要求降低类间(对象间)耦合关系,并不是要求完全没有依赖关系
合成复用原则
尽量使用合成或者聚合的方式,而不是使用继承
找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起
针对接口编程,而不是针对具体实现编程
松耦合设计
待整理