设计模式
设计模式(design pattern)是对软件设计模式中普遍存在的各种问题所提出的解决方案。是从建筑设计领域引入到计算机科学的。
目的
-
代码重用性:相同功能的代码,不用多次编写
-
可读性:编程规范性,便于其他程序员的阅读和理解
-
可扩展性:需要新增功能时非常方便,也称为可维护性
-
可靠性:新增的佳能对原来的功能不会造成影响
-
高内聚、低耦合:模块内部紧密,模块之间隔离
七大原则
设计模式原则,其实就是程序员在编程时,应当遵守的原则,也是各种设计模式的基础(即:设计模式为什么这样设计的依据)
-
单一职责原则
-
接口隔离原则
-
依赖倒转(倒置)原则
-
里氏替换原则
-
开闭原则 ocp
-
迪米特原则
-
合成服用原则
单一职责原则
用一句话来说就是:一个类应该只负责一项职责
示例
/*
* 单一职责模式Demo
*/
public class SimpleResponsibility1 {
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
vehicle.run("摩托车");
vehicle.run("汽车");
vehicle.run("飞机");
vehicle.run("轮船");
}
}
// 交通工具
class Vehicle{
// 跑的方法
public void run(String vehicle) {
System.out.println(vehicle+" 在公共路上运行...");
}
}
结果
摩托车 在公共路上运行...
汽车 在公共路上运行...
飞机 在公共路上运行...
轮船 在公共路上运行...
从输入结果来看显然是不对的,需要对 Vehicle 类进行修改
改进1
public class SimpleResponsibility2 {
public static void main(String[] args) {
RunVehicle runVehicle = new RunVehicle();
runVehicle.run("摩托车");
runVehicle.run("汽车");
AirVehicle airVehicle = new AirVehicle();
airVehicle.run("飞机");
WaiterVehicle waiterVehicle = new WaiterVehicle();
waiterVehicle.run("轮船");
}
}
//公路交通工具
class RunVehicle{
public void run(String vehicle) {
System.out.println(vehicle+" 在公共路上运行...");
}
}
//飞行交通工具
class AirVehicle{
public void run(String vehicle) {
System.out.println(vehicle+" 在天上运行...");
}
}
//水路交通工具
class WaiterVehicle{
public void run(String vehicle) {
System.out.println(vehicle+" 在水中运行...");
}
}
结果
摩托车 在公共路上运行...
汽车 在公共路上运行...
飞机 在天上运行...
轮船 在水中运行...
输入的结果是正确的,也符合单一指责模式,但是对于这种需求的话还是有点问题,改动太大,将类分解,同时需要修改客户端。
改进2
public class SimpleResponsibility3 {
public static void main(String[] args) {
Vehicle2 vehicle2 = new Vehicle2();
vehicle2.runRoad("摩托车");
vehicle2.runRoad("汽车");
vehicle2.runAir("飞机");
vehicle2.runWaiter("轮船");
}
}
class Vehicle2 {
public void runRoad(String vehicle) {
System.out.println(vehicle+" 在公共路上运行...");
}
public void runAir(String vehicle) {
System.out.println(vehicle+" 在天上运行...");
}
public void runWaiter(String vehicle) {
System.out.println(vehicle+" 在水中运行...");
}
}
结果
摩托车 在公共路上运行...
汽车 在公共路上运行...
飞机 在天上运行...
轮船 在水中运行...
结果同样是正确的,这样做的好处就是没有对原来的类进行大的修改,只是增加了方法,虽然在类的级别没有符合单一职责原则,但是在方法的级别符合单一职责原则
注意事项
-
降低类的负责度,一个类只负责一项原则
-
提高类的可读性、可维护性
-
降低变更带来的风险
-
通常情况下,我们应该遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则:只有类中的方法数量足够少,可以在方法级别保持单一职责原则。
接口隔离原则
接口隔离原则(Interface Segregation Principle),客户端不应该依赖它不需要的接 口,即一个类对另一个类的依赖 应该建立在最小的接口上