设计模式的目的
编写软件过程中,程序员面临六大问题来自耦合性,内聚性以及可维护性,可扩展性和重用性,灵活性多方面挑战
1.代码重用性(相同功能的代码不用多次编写)
2.可读性(编程规范,便于其他程序员阅读和理解)
3.可扩展性(需要增加功能时非常方便称为可维护)
4.可靠性(增加新功能对原来的功能没有影响)
5.使程序呈现高内聚和低耦合
6.设计模式包含面向对象的精髓,懂了设计模式就懂了面向对象分析和设计(ooa/d)的精要
7.Scott Mayers 在其巨著《Effective C++》就曾经说过:C++老手和 C++新手的区别就是前者手背上有很多伤疤
设计模式七大原则
1.单一职责原则(对类来说一个类只负责一项职责,如果a类负责两个不同的职责,职责1,职责2需求变更更改职责a可能会导致职责2错误,所以将类a的粒度分解为a1和a2)
应用实例:
方法一:
package com.atguigu.principle.singleresponsibility
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 + " 在公路上运行....");
}
}
方案二:
package com.atguigu.principle.singleresponsibility
public class SingleResponsibility2 {
public static void main(String[] args) {
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 + "水中运行");
}
}
方案三:
package com.atguigu.principle.singleresponsibility;
public class SingleResponsibility3 {
public static void main(String[] args) {
// TODO Auto-generated method stub Vehicle2 vehicle2 = new Vehicle2();
vehicle2.run("汽车");
vehicle2.runWater("轮船");
vehicle2.runAir("飞机");
}
}
//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 + " 在水中行....");
}
//方法 2.
//..
//..
//...
}
单一职责原则注意事项和细节
(1)降低类的复杂性,一个类只负责一项职责
(2)提高类的可读性,可维护性
(3)降低变更引起的风险
(4)通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则,只有类中方法足后少,可以在方法级别保持单一职责原则
2.接口隔离
3.依赖倒置
4.里氏替换
5.开闭原则
6.迪米特法则
7.合成复用原则