一、设计模式的概念以及分类
二、设计模式的主题和意图
设计模式的主题是关于软件设计中反复出现的问题以及相应的解决方案。这些主题是基于长期实践经验的总结,旨在提供一套可复用的设计思路和框架,以应对软件开发中的复杂性和变化性。
三、面向对象程序设计原则,记住名字,还要理解它的使用场景以及如何用?
提高可维护、可复用、可扩展、灵活性 。
面向对象程序设计原则是一组指导性的规则,旨在帮助开发人员创建更加模块化、灵活和易于维护的代码。这些原则主要包括:
一、单一职责原则(Single Responsibility Principle, SRP)
- 定义:一个类应该只有一个引起它变化的原因,即一个类只负责一个功能或一个职责。
- 目的:降低类的复杂度,提高类的可读性和可维护性。如果一个类有多个职责,当其中一个职责发生变化时,可能会影响到其他职责,从而增加系统的复杂性和出错率。
- 应用:在设计类时,要确保每个类都只有一个明确的职责,并尽量避免将多个职责耦合在一起。
二、开放封闭原则(Open/Closed Principle, OCP)
- 定义:软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。
- 目的:在不修改现有代码的情况下,通过扩展来实现新的功能。这有助于保持系统的稳定性和可维护性。
- 应用:在设计时,要考虑到未来可能的扩展需求,并为之预留接口或抽象类。当需要添加新功能时,可以通过继承或实现这些接口或抽象类来实现,而不是直接修改原有的代码。
三、里氏替换原则(Liskov Substitution Principle, LSP)
子类可以扩展父类的功能,但不能改变父类原有的功能。换句话说,子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。四、接口隔离原则(Interface Segregation Principle, ISP)
- 定义:客户端不应该被迫依赖于它们不使用的方法;一个类对另一个类的依赖应该建立在最小的接口上。
- 目的:减少类之间的耦合度,提高系统的灵活性和可维护性。通过为客户端提供尽可能小的接口,可以减少它们对不必要方法的依赖,从而降低系统的复杂性。
- 应用:在设计接口时,要尽量细化接口,将不同的功能拆分成不同的接口。这样,客户端只需要依赖它们需要的接口,而不需要依赖整个庞大的接口集合。
五、依赖倒置原则(Dependence Inversion Principle, DIP)
- 定义:高层模块不应该依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。
- 目的:减少系统各部分的依赖关系,提高系统的稳定性和可维护性。通过依赖抽象而不是具体实现,可以降低系统之间的耦合度,从而更容易地进行单元测试和代码重构。
- 应用:在设计时,要尽量使用接口或抽象类来定义高层模块和低层模块之间的依赖关系。这样,当低层模块的实现发生变化时,只需要修改低层模块的代码,而不需要修改高层模块的代码。
六、组合/聚合复用原则(Composite/Aggregate Reuse Principle, CARP)
- 定义:尽量使用合成/聚合的方式来实现复用,而不是使用继承。
- 目的:通过组合/聚合关系来实现类的复用,可以降低类之间的耦合度,提高系统的灵活性和可扩展性。
- 应用:在设计类时,要尽量使用合成/聚合关系来关联其他类,而不是通过继承来复用代码。这样可以避免因为继承而导致的代码冗余和复杂性增加。
七、针对接口编程,而不是针对实现编程
- 定义:在编程时,要尽量针对接口进行编程,而不是针对具体的实现进行编程。
- 目的:通过针对接口编程,可以降低系统之间的耦合度,提高系统的灵活性和可扩展性。同时,这也有助于实现多态性和代码的重用性。
- 应用:在编写代码时,要尽量使用接口或抽象类来定义变量和方法的返回类型。这样,当具体的实现发生变化时,只需要修改实现类的代码,而不需要修改调用这些接口或抽象类的代码。
综上所述,面向对象程序设计原则是一组重要的指导规则,它们有助于开发人员创建更加模块化、灵活和易于维护的代码。在实际开发中,应该根据具体的需求和场景来灵活运用这些原则,以创建出高质量的软件系统。
四、松耦合、紧耦合、强关联、弱关联、静态复用、动态复用的概念,还有静态委派,动态委派
(是一样的东西,要从不同角度去理解)博客里写死,叫紧耦合强关联静态复用,写代码这两个模块的关系不确定,根据程序运行时才动态的关联起来,这叫松耦合弱关联,动态复用
五、模式中工厂方法模式、抽象工厂模式(说过一道必考题)
六、结构模式中的代理模式,动机、意图、实现方式、应用场景分别
七、行为模式中观察者模式和策略者模式
第三章
八.选择、判断各个模式都会涉及
单例模式中什么叫按需加载、懒加载
校园模式的池记
装置器模式动态复用,动态功能的附加
4.设计模式中的类模式和对象模式,哪些是类模式,哪些是对象模式
5.23钟模式里边类模式只有四种,工厂方法模式、实例模式、类示例器模式、模板方法模式(不准确)
九、类图
依赖关系:
class Computer {
public:
static void start(){
cout<<"电脑正在启动"<<endl;
}
};
class Student {
public:
//返回值构成依赖
Computer& program();
//形参构成依赖
void program(Computer&);
void playGame() {
//局部变量构成依赖
Computer* computer=new Computer;
...
//静态方法调用构成依赖
Computer::star();
}
};
关联关系:类 Student 将成为类 Classes 的成员变量
class Teacher;
class Student {
public:
Teacher teacher; //成员变量
void study();
}
聚合关系:类 Student 将成为类 Classes 的成员变量
public class People{
Car car;
House house;
//聚合关系中作为成员变量的类一般使用set方法赋值
public void setCar(Car car){
This.car = car;
}
public void setHouse(House house){
This.house = house;
}
public void driver(){
System.out.println(“车的型号:”+car.getType());
}
public void sleep(){
System.out.println(“我在房子里睡觉:”+house.getAddress());
}
}
组合关系:类 Heart 将成为类 Student 的成员变量
Public class People{
Soul soul;
Body body;
//组合关系中的成员变量一般会在构造方法中赋值
Public People(Soul soul, Body body){
This.soul = soul;
This.body = body;
}
Public void study(){
System.out.println(“学习要用灵魂”+soul.getName());
}
Public void eat(){
System.out.println(“吃饭用身体:”+body.getName());
}
}