总述:
一、设计模式:
经典的设计模式总共23种,是一系列不同的编程模式与代码编写风格,在本人看来就是一个基础构件,一种框架。
二、设计模式的目的:
在编写软件过程中,程序员面临着来自耦合性,内聚性以及可维护性,可拓展性,重用性,灵活性等多方面的挑战。设计模式是为了让程序(软件),具有更好的可维护性,可拓展性,重用性,灵活性,可靠性,使得程序呈现高内聚,低耦合的特点。
三、设计模式的七大原则(编程时应该遵守的原则,也是设计模式的基础)
1.单一职责原则
2.接口隔离原则
3.依赖倒转原则
4.里氏转换原则
5.开闭原则ocp
6.迪米特法则
7.合成复用原则
四、设计模式的分类:
创建类型设计模式(5种):工厂方法;抽象工厂;单列;建造者;原型
构造型设计模式(7种):适配器;装饰器;代理;外观;桥接;组合;享元
行为型设计模式(11种):策略;模板方法;观察者;迭代器;责任链;命令;备忘录;状态;访问者;中介者;解释器
五、设计模式七大原则详解:
1、单一职责原则:
概念:
对一个类来说,即一个类应该只负责一项职责。(一个职责不等同于一个方法)
如类A负责两个不同职责:职责1,职责2。当职责1需要变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1,A2
核心:
降低类的复杂度,达到一个类只负责一项职责
特点:
提高类的可读性,可维护性;降低变更带来的风险
注:
一般,要遵守单一职责原则,只有逻辑足够简单,才可以在代码级别违反单一职责原则;只有类中方法足够少,才可以在方法级别保持单一职责原则
{
public class Responsibility00 {
public static void main(String[] args) {
Vehicle00 vehicle00 = new Vehicle00();
vehicle00.run("摩托");
vehicle00.run("汽车");
vehicle00.run("飞机");
System.out.println("************************************");
RoadVehicle00 roadVehicle00 = new RoadVehicle00();
roadVehicle00.run("摩托");
roadVehicle00.run("汽车");
AirVehicle00 airVehicle00 = new AirVehicle00();
airVehicle00.run("飞机");
System.out.println("***********************************");
Vehicle01 vehicle01 = new Vehicle01();
vehicle01.run("摩托");
vehicle01.run("汽车");
vehicle01.runAir("飞机");
vehicle01.runWater("潜艇");
}
}
//**********************************************
//交通工具类
/*
方式3:
此修改方法没有对原来的类做大的修改,只是增加方法
这里虽然没有在类这个级别上最少单一职责原则,但在方法级别上,仍然是遵守单一职责
*/
class Vehicle01{
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:
遵守了单一职责原则,但这样做的开销较大,即将类分解,同时修改客户端
改进:直接修改DP0P0Vehicle00,改动的代码会比较少
*/
class WaterVehicle00{
public void run(String vehicle){
System.out.println(vehicle+"在水中运行。。。。");
}
}
class AirVehicle00{
public void run(String vehicle){
System.out.println(vehicle+"在天空运行。。。。");
}
}
class RoadVehicle00{
public void run(String vehicle){
System.out.println(vehicle+"在公路上运行。。。。");
}
}
//***********************************************
//交通工具类
/*
方式1:
在方式1的run方法中,违反了单一职责原则,因为不存在飞机公路上运行
解决方案:根据交通工具运行的方式不同,分解成不同的类即可
*/
class Vehicle00{
public void run(String vehicle){
System.out.println(vehicle+"在公路上运行。。。。");
}
}
}