1、设计模式的目
编写软件过程中,程序员面临着来自 耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性 等多方面的挑战,设计模式是为了让程序
(
软件
)
,具有更好
1)
代码重用性
(
即:相同功能的代码,不用多次编写
)
2)
可读性
(
即:编程规范性
,
便于其他程序员的阅读和理解
)
3)
可扩展性
(
即:当需要增加新的功能时,非常的方便,称为可维护
)
4)
可靠性
(
即:当我们增加新的功能后,对原来的功能没有影响
)
5)
使程序呈现
高内聚
,
低耦合
的特性
2、设计模式常用的七大原则
设计模式原则,其实就是程序员在编程时,应当遵守的原则,也是各种设计模式的基础(
即:
设计模式为什么这样设计的依据
),常见的七种原则如下:
1)
单一职责原则
2)
接口隔离原则
3)
依赖倒转原则
4)
里氏替换原则
5)
开闭原则
ocp
6)
迪米特法则
7)
合成复用原则
3、单一职责原则
单一职责原则注意事项和细节
1)
降低类的复杂度,一个类只负责一项职责。
2)
提高类的可读性,可维护性
3)
降低变更引起的风险
4)
通常情况下,
我们应当遵守单一职责原则
,只有逻辑足够简单,才可以在代码级违反单一职责原则;只有类中方法数量足够少,可以在方法级别保持单一职责原则。
基本介绍
对类来说的,即一个类应该只负责一项职责。如类
A
负责两个不同职责:职责
1
,职责
2
。当职责1
需求变更而改变
A
时,可能造成职责
2
执行错误,所以需要将类
A
的粒度分解为A1,
A2
案例分析:
public class SingleResponsibility1 { public static void main(String[] args) { Vehicle vehicle = new Vehicle(); vehicle.run("摩托车"); vehicle.run("汽车"); vehicle.run("飞机"); } } // 交通工具类 // 方式1 // 1. 在方式1 的run方法中,违反了单一职责原则 // 2. 解决的方案非常的简单,根据交通工具运行方法不同,分解成不同类即可 class Vehicle { public void run(String vehicle) { System.out.println(vehicle + " 在公路上运行...."); } } |
public class SingleResponsibility2 { public static void main(String[] args) { // TODO Auto-generated method stub RoadVehicle roadVehicle = new RoadVehicle(); roadVehicle.run("摩托车"); roadVehicle.run("汽车"); AirVehicle airVehicle = new AirVehicle(); airVehicle.run("飞机"); } } //方案2的分析 //1. 遵守单一职责原则 //2. 但是这样做的改动很大,即将类分解,同时修改客户端 //3. 改进:直接修改Vehicle 类,改动的代码会比较少=>方案3 class RoadVehicle { public void run(String vehicle) { System.out.println(vehicle + "公路运行"); } } class AirVehicle { public void run(String vehicle) { System.out.println(vehicle + "天空运行"); } } class WaterVehicle { public void run(String vehicle) { System.out.println(vehicle + "水中运行"); } } |
public class SingleResponsibility3 { public static void main(String[] args) { // TODO Auto-generated method stub Vehicle2 vehicle2 = new Vehicle2(); vehicle2.run("汽车"); vehicle2.runWater("轮船"); vehicle2.runAir("飞机"); } } //方式3的分析 //1. 这种修改方法没有对原来的类做大的修改,只是增加方法 //2. 这里虽然没有在类这个级别上遵守单一职责原则,但是在方法级别上,仍然是遵守单一职责 class Vehicle2 { public void run(String vehicle) { //处理 System.out.println(vehicle + " 在公路上运行...."); } public void runAir(String vehicle) { System.out.println(vehicle + " 在天空上运行...."); } public void runWater(String vehicle) { System.out.println(vehicle + " 在水中行...."); } } |