一、设计模式综述
1.设计模式基本概念
设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。
2.类图及类图之间的关系(UML)
-
类图的画法
-
类图之间的关系
关联关系:如果一个类的实例为了进行某方面的工作,必须知道另外一个类的属性与方法,则我们就说该两个类之间存在关联。通常将一个类的对象作为另一个类的属性。
- 一般关联关系:
2.聚合关系:代表整体与部分的关系,二者可以独立存在。在Java中及单独的两个类,一个类的对象作为另一个类的属性,通过传参等方法在包含的类中使用。
3.组合关系:组合关系也是一种整体与部分的关系,其中整体部分负责创建和消灭部分类的对象。二者不可分割。在Java中被包含的类只能在此类中实例化对象(new)来使用。
依赖关系:常表现为使用关系,及一个类使用另一个类,被使用类不作为使用类的属性,只是通过传参的方式进行调用。
泛化关系:相当于Java中的继承关系,即一个类继承另一个类。
3.类图案例
用户通过注册界面(RegisterForm)输人个人信息,单击“注册”按钮后将输人的信息通过一个封装用户输入数据的对象(UserDTO)传递给操作数据库的数据访问类,为了提高系统的扩展性,针对不同的数据库可能需要提供不同的数据访问类,因此提供了数据访问类接口,如 IUserDAO,每一个具体数据访问类都是某一个数据访问类接口的实现类,如OracleUserDAO 就是一个专门用于访问 Oracle 数据库的数据访问类。
二、 面向对象七大原则
在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据7条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。
1.单一职责原则
- **概念:**一个对象应该只包含单一的职责,并且该职责应该被完全的封装在一个类
- **原理:**类的职责是高内聚,低耦合,类的职责有数据职责和行为职责
- 案例说明:
2.开闭原则
-
**概念:**一个软件实体应当对拓展开放,对修改关闭。也就是在设计一个模块时,应当使得模块在不被修改的前提下可以进行扩展,即在不修改模块的情况下改变模块的行为。
-
**原理:**对系统进行抽象化设计,可以为系统设计一个相对稳定的抽象层和接口,将不同的实现行为在抽象层中扩展。
-
案例说明:
3.里氏代换原则
-
**概念:**任何基类可以出现的地方,子类一定可以出现。通俗理解:子类可以扩展父类的功能,但不能改变父类原有的功能。换句话说,子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。
-
**原理:**Java的继承原理和Java的多态原理
调用成员变量:编译看左边,运行看左边
javac编译代码的时候,会看左边的父类中有没有这个变量,如果有,编译成功,如果没有编译失败。
java运行代码的时候,实际获取的就是左边父类中成员变量的值
**调用成员方法:**编译看左边,运行看右边
编译看左边:javac编译代码的时候,会看左边的父类中有没有这个方法,如果有,编译成功,如果没有编译失败。
运行看右边: java运行代码的时候,实际上运行的是子类中的方法。
- 案例分析:
类RectangleDemo是我们的软件系统中的一个组件,它有一resize方法依赖基类Rectangle,resize方法是RectandleDemo类中的一个方法,用来实现宽度逐渐增长的效果。当传入正方形时会造成死循环
在resize方法中,只可以传入长方形,而在printLengthAndWidth方法中,根据里氏替换原则可以用正方形和长方形的父类作为参数。
4.依赖倒转原则
-
**概念:**高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。
-
原理:
尽量使用抽象类,及代码在传递参数或在组合聚合关系中尽可能使用层次高的抽象类。
类与类之间的抽象耦合是依赖倒转原则的基础。
里氏替换原则是依赖倒转原则的基础。
-
**依赖注入:**传递对象直接的依赖关系
分类:构造注入(通过构造函数传递依赖对象),设值注入(通过 setter方法传递依赖关系),接口注入(通过实现接口的抽象方法传 递依赖关系)
- 案例分析:
5.接口隔离原则
- **概念:**客户端不应该被迫依赖于它不使用的方法;一个类对另一个类的依赖应该建立在最小的接口上。
- **原理:**单一职责原则
- 案例分析:
6.合成复用原则
- **概念:**尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。(一个新的对象里通过关联关系来使用一些已有的对象使之成为新对象的一部分)
- **原理:**降低类与类之间的耦合度
- 继承复用:
- 组合或聚合复用:
- 案例分析:
上述DBUtils直接被继承,当数据库改变后,对于连接不同的数据库很难实现类的复用,因此可以使用合成复用:
7.迪米特法则(最少朋友原则)
- **概念:**如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。
迪米特法则中的“朋友”是指:当前对象本身、当前对象的成员对象、 当前对象所创建的对象、当前对象的方法参数等,这些对象同当前对 象存在关联、聚合或组合关系,可以直接访问这些对象的方法。
- **原理:**对信息进行隐蔽,降低耦合,主要用于控制信息过载
- 案例说明:
由于此系统的依赖关系复杂,很难实现复用,因此引入第三者作为自己的直接朋友,通过直接朋友,最少的和其他朋友进行通信