解释器模式
简介:
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示
享元模式
作用:
可以避免大量非常相似类的开销。
在程序设计的中,有时需要生成大量细粒度的类实例来表示数据。如果能发现实例除了几个参数外基本相同的,有时就能够受大幅度地减少需要实例化的类的数量。
如果能把这些参数移到类实例的外面,在方法调用时将他们传递进来,就可以通过共享大幅度的减少单个实例的数目。
使用场景:
比方说一个五子棋的项目,不能每一个棋子都创建一个对象,其实只需要一个五子棋对象就行了,他们之间相同的地方是颜色相同,所以颜色是享元对象的内部属性,外部属性是五子棋的坐标。
命令模式
UML类图
49D0BAFF-5B43-479C-852A-12849FC8AAF5.png
简介:
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
总结:
将具体的命令创建一个类,这样在每次增加命令的时候,
都只需要增加一个新类就可以了。
桥接模式
优先使用对象合成/聚合,而不是类继承。
合成/聚合复用原则
好处:
有助于你保持每个类被封装,并被集中在单个任务上。
这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。
![](https://img.haomeiwen.com/i3376638/55c7a3534f847839.png)
上面的这种方式不好扩展;
修改为下面的这种方式:
![](https://img.haomeiwen.com/i3376638/2ec1223a62650f0a.png)
简介:
讲抽象部分与它的实现部分分离,使它们都可以独立地变化。
抽象与其派生类分离,并不是说,让抽象类与其派生类分离,因为这没有任何意义。
实现指的是抽象类和它的派生类用来实现自己的对象。
举例:手机既可以按照品牌分类,也可以按照功能分类。
迭代器模式
简介:
提供一个方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
迭代器的作用,就是可以用更多的方式来遍历乘客,而不是只需要一种方式。
应用场景:
当需要遍历一个集合对象的时候,创建一个迭代器类,用来左右前后反反复复的遍历这个集合对象。
UML类图
![](https://img.haomeiwen.com/i3376638/67da745414334ff6.png)
iOS已经帮我们封装好了迭代器NSEnumerator
组合模式
89B6676E-0DC6-452B-BA0F-A9A00E59D562.png
有了组合模式可以少很多if else的判断逻辑在里面。
策略模式
策略模式定义了一系列算法的方法,才概念上来看,所有这些算法完成的是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
应用场景:
需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化
与工厂类的区别:将创建工厂对象和调用工厂方法的逻辑封装在一个Context类中,和工厂方法结合起来使用
UML类图:
![](https://img.haomeiwen.com/i3376638/0a5d18d9c94b1ab9.png)
设计模式的基本原则:
- 单一职责原则
- 开发-封闭原则(面向扩展开发,面向改变封闭)
- 依赖倒转原则
1)高层模块不应该依赖低层模块,两个都应该依赖抽象
2)抽象不应该依赖细节,细节应该依赖抽象) - 里氏代换原则
子类类型可以替换调父类类型 - 迪米特法则
如果两个类,不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
装饰器模式
动态的给一个对象添加一些额外的职责,就增加功能来说,装饰器模式比生成子类更为灵活。
屏幕快照 2018-10-18 下午5.42.36.png
代理模式
为其他对象提供一种代理以控制对这个对象的访问。
定义了RealSubject和Proxy的公共接口,这样就在任何使用RealSubject的地方都可以使用Proxy
代理的用法和原来类的用法相同,可以在代理模式下边封装自己想要的一些方法。
代理的作用:当调用真是对象时,代理处理另外一些事。
代理模式其实就是在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。
![](https://img.haomeiwen.com/i3376638/198c191b0d0649d6.png)
工厂方法模式
简介:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
原型模式
从一个对象创建另一个可定制的对象。而且不需要知道任何创建的细节。
模版方法模式
当我们要完成某一个细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们考虑用模版方法模式来处理。
具体实现流程:
把不一样的地方,创建一个方法代替原来固定的值,然后子类中就可以重写这个方法来实现自己不同的逻辑。
模版方法模式简介:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
UML类图:
![](https://img.haomeiwen.com/i3376638/c69f7907fbd348bd.png)
列表相似度很高的时候,应用模版设计模式。
外观模式
为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
使用场景:
- 当调用三方类库的时候,三层架构。层与层之间简历Facade
-
当新系统和老系统交互的时候,让新系统和Facade层交互,来提供粗糙或者高度复杂的遗留代码的比较清晰简单的接口。
外观模式.png
建造者模式
将一个复杂对象的构建与它的表示分离,是的同样的构建过程可以创建不同的表示
观察者模式
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个对象在状态发生变化时,会通知所有观察者对象,让他们能够自动更新自己。
使用场景:
当一个对象的改变需要同时改变其它对象的时候。
抽象工厂模式
状态模式
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
使用场景:
当控制一个对象状态转换的条件表达式过去复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以吧复杂的判断逻辑简化。
![](https://img.haomeiwen.com/i3376638/ec9882930792c7f7.png)
网友评论