设计模式也是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式的目的就是为了重用代码、让代码更容易被他人理解、保证代码可靠性。欢迎小伙伴们收藏关注,持续分享更多优质干货!
设计模式之道
何为设计模式?
设计模式的分门别类
1、原型(Prototype)模式
2、工厂方法(Factory Method)模式
3、抽象工厂(AbstractFactory) 模式
4、单例(Singleton)设计模式
5、生成器(Builder)模式
6、适配器(Adapter Pattern)模式
7、桥接(Bridge)模式
8、外观(Facack) 模式
9、中介者(Mediator)模式
10、观察者(Observer)模式
11、组合(Composite)模式
12、迭代器(Iterator Pattern)模式
13、访问者(Visitor Pattern)模式
14、装饰器(Decorator)模式
15、责任链(Chain of Responsibility)模式
16、状态(State Pattern)模式
17、策略(Strategy)模式
18、命令(Command) 模式
19、享元(Flyweight)模式
20、代理(Proxy Pattern)模式
21、备忘录(Memento Pattern)模式
Hello,你好呀,我是灰小猿!一个超会写bug的程序猿!
提到设计模式,相信小伙伴们一定都不会陌生,而且在很多在公司的岗位要求上,都会要求我们或多或少的掌握或使用过几个设计模式。今天我就和大家一起来就21种设计模式的最通俗的定义和使用场景进行分析,势必与面试官掰扯到底!!!
首先,何为设计模式(养生之道)?且听一一分解!
设计模式(Design pattern)代表了一种最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的一种解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。所以毋庸置疑,单单从字面意思就知道,设计模式是用来解决开发中遇到的难题的。
设计模式也是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。看这一句是不是就已经知道了设计模式的定义了呢?使用设计模式的目的就是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 也可以说是为了简化开发而诞生的。毫无疑问,设计模式对于开发者和对于系统来说都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。
听了这么多概念,是不是也不一定记得住?没关系!记住设计模式是为了在遇到问题时能简化开发,尽快解决的就行了。
上面也说到了,设计模式是经过分类编目的,那么它就一定是有很多种分类的,所以按照这21种设计模式的使用场景和特点,可以分为以下八种!
是不是也觉得很多记不住啦?没关系啦!其实对于这些设计模式,还有一个简单的分类,就是按照使用目的划分为的三类:
其中:
按照分类只记住这几种就会简单一些。其实每一种设计模式都有属于它的特点和应用场景,经过反复的练习,掌握每一种设计模式的定义和应用场景,应对简单的面试还是没有问题的。最重要的就是之后合理使用其来开发项目,应用到实战中,彻彻底底的秀面试官一脸!
接下来就来和大家介绍一下这21种设计模式的基本定义和适用场景,记住这个对于之后熟练使用设计模式是很有帮助的!
定义:原型(Prototype)模式用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。
适用场景:
定义:工厂方法(Factory Method)模式定义一个用于创建对象的接口,让子类决定将哪一个类实例化,使一个类的实例化延迟到其子类。
适用场景:
定义:抽象工厂(AbstractFactory) 模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
适用场景:
定义:单例(Singleton)设计模式是一种创建型模式,其意图是保证一个类仅有一个实例,并提供一个访问这个唯一实例的全局访问点。
适用场景:
定义:生成器(Builder)模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
适用场景:
定义:适配器模式将类的接口转换成客户希望的另外一个接口,目的是消除由于接口不匹配所造成的类的兼容性问题。
适用场景:
定义:桥接模式把抽象层次结构从实现中分离出来,使其能够独立变更。抽象层定义了供客户端使用的上层抽象接口。实现层次结构定义了供抽象层次使用的底层接口。
适用场景:
定义:外观(Facack) 模式为子系统中的一组接口提供一个致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
适用场景:
定义:中介者(Mediator)模式用一个中介对象来封装系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
适用场景:
定义:观察者(Observer) 模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
适用场景:
定义:组合模式将对象组合成树形结构以表示“部分-整体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
适用场景:
定义:迭代器提供了一种顺序访问聚合对象(集合)中元素的方法,而无需暴露结构的底层表示和结构细节。 遍历集合元素的任务从集合 转移给了迭代器对象。
适用场景:
注意:迭代器分为内部迭代器和外部迭代器。
外部迭代器允许客户端更自由的使用,同时需要熟悉组合对象的内部结构。
内部迭代器被封装在集合内部,在集合外部提供接口。
集合对象(nsarray, nsdictionary)都默认提供了迭代器。
定义:访问者模式作用于组合对象结构中的每一个元素的操作,它让我们在不改变元素类的前提下,扩展这些类的新操作。在接受访问者的接口方法中,实现将元素传给访问者,然后访问者扩展对元素的操作。
适用场景:
定义:装饰器模式描述了以透明围栏来支持修饰的类和对象的关系,动态地给一个对象添加一些额外的职责,从增加功能的角度来看,装饰器模式相比生成子类更加灵活。
适用场景:
定义:责任链模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
适用场景:
定义:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。
适用场景:
定义:策略模式定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。此模式使得算法可以独立于使用它们的客户而变化,
适用场景:
定义:命令模式将一个请求封装为一个对象,从而使得可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
适用场景:
定义:享元模式运用共享技术有效地支持大量细粒度的对象。
适用场景:
一个应用程序使用了大量的对象;
定义:通过提供与对象相同的接口来控制对这个对象的访问,以使得在确实需要这个对象时才对它进行创建和初始化。
代理模式可以分为远程代理和虚拟代理。
远程代理:用本地对象代替远程对象。如:发送网络时的代理服务器。
虚拟代理:将代理直接面向客户端,使客户端认为操作的虚拟代理就是真实对象。虚拟代理提供占位对象和重型对象。默认使用占位对象,当需要使用重型对象时才加载。
适用场景:
使用实例:
Object-C不支持多继承,如果代理对象不是NSObject的子类的话,可以考虑用NSProxy来作为占位或者替代对象。尽管NSProxy也是NSObject类型,但是NSProxy的作用就是当代理。
定义:在不破坏原有封装的前提下,捕获一个对象的内部状态,并在该对象之外保存状态。 这样,之后可将对象恢复到之前的状态。将状态封装成对象保存。
适用场景:
使用实例:
Cocoa Touch框架在归档,属性列表序列化,核心数据中采用了备忘录模式。
好了,关于21种设计模式的讲解就先分享这些,掌握了这些基本理论,和面试官掰扯几个回合应该是没问题了,之后就看你如何机智的使用设计模式开发项目了!
关于设计模式有问题的小伙伴们可以在评论区留言提出!
觉得不错记得点赞关注哟!
灰小猿陪你一起进步呀!