《C++面试宝典》V1.0 冲刺大厂~持续更新(13)
分享面试总结,涉及C++、算法、数据结构、操作系统、计算机网络、Linux、数据库、设计模式等,后面持续更新~
# 设计模式
参考书籍《设计模式》--可复用面向对象软件的基础,机械工业出版社。这本书共六章,3-5章分别叙述了创建型模型,结构型模型和行为型模型。
CSDN博客:Java开发中的23种设计模式详解
史上最全设计模式导学目录(完整版):https://blog.csdn.net/LoveLion/article/details/17517213
23 种设计模式详解(全23种):https://blog.csdn.net/A1342772/article/details/91349142
23种设计模式汇总整理:https://blog.csdn.net/jason0539/article/details/44956775
23种常用设计模式(C++):https://blog.csdn.net/u012212811/article/details/40814303单例模式
1) 一个类只有一个实例,即一个类只有一个对象实例,并提供访问它的全局点;
2) 所有的单例模式都是使用静态方法进行创建的,所以单例对象在内存中静态共享区中存储;
3) 单例模式分为饿汉式和懒汉式,懒汉式单例模式在类加载时不初始化,饿汉式单例模式,在类加载时就完成初始化,所以类加载较慢,但获取对象速度快。
扩展:手写线程安全的单例模式
工厂模式
1) 简单工厂模式,简单工厂模式是由一个工厂对象根据收到的消息决定要创建哪一个类的对象实例。需要switch或if进行类型选择;工厂类创建的对象比较少,客户只需要传入工厂类参数,对于如何创建对象不关心。
2) 工厂方法模式,定义一个创建对象的工厂接口,让子类决定实例化哪一个类,将实际创建工作推迟到子类当中。创建对象的接口,让子类决定具体实例化的对象,把简单的内部逻辑判断移动到客户端。
3) 抽象工厂模式,抽象工厂是围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
装饰器模式
1) 动态地给一个对象增加一些额外的职责。在为对象增加额外职责方面,装饰模式替代了继承,它比子类继承父类更为灵活,它用无需定义子类的方式来给对象动态的增加职责,使用对象之间的关联关系来取代继承,同时避免类型体系的快速膨胀。
2) 装饰器模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能。
3) 装饰器的价值在于装饰,他并不影响被装饰类本身的核心功能。在一个继承的体系中,子类通常是互斥的。
订阅/发布模式
1) 订阅发布模式定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象。这个主题对象在自身状态变化时,会通知所有的订阅者,使它们能够自动更新自己的状态;
2) 发布者向某个信道发布一条消息,订阅者绑定这个信道,当有消息发布至信道时就会接受到一个通知。
观察者模式
1) 在对象之间定义一个一对多的依赖关系,这样一来,当一个对象改变状态,依赖他的对象会收到通知自动更新;2) 抽象被观察对象,抽象观察对象,具体被观察者对象,具体观察者对象;
3) 微信公众号是一个典型的例子,有一个微信公众号服务,不定时发布一些消息,关注公众号就可以收到推送消息,取消关注就收不到推送消息;
4) 一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。
MVC模式
1) MVC的全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范。它是用一种业务逻辑、数据与界面显示分离的方法来组织代码,将众多的业务逻辑聚集到一个部件里面,在需要改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑,达到减少编码的时间。
2) 使用的MVC的目的:在于将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。
3) 用户首先在界面中进行人机交互,然后请求发送到控制器,控制器根据请求类型和请求的指令发送到相应的模型,模型可以与数据库进行交互,进行增删改查操作,完成之后,根据业务的逻辑选择相应的视图进行显示,此时用户获得此次交互的反馈信息,用户可以进行下一步交互,如此循环。