iOS之13种设计模式

JeffereyHPE 8年前
   <h2>基本原则</h2>    <ul>     <li> <p>开闭原则(Open Close Principle):对扩展打开,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。</p> </li>     <li> <p>里氏代换原则(Liskov Substitution Principle):父子可以相互调用,父类必须提供足够多的抽象方法供子类重载使用。 任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。</p> </li>     <li> <p>依赖倒转原则(Dependence Inversion Principle):抽象不依赖细节,细节依赖抽象。这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。</p> </li>     <li> <p>接口隔离原则(Interface Segregation Principle):尽量做必要的事。使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。</p> </li>     <li> <p>最少知道原则(Demeter Principle):个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。</p> </li>     <li> <p>合成/聚合复用: 尽量使用合成/聚合的方式,而不是使用继承。</p> </li>    </ul>    <h2>13种设计模式</h2>    <p>适配器模式</p>    <ol>     <li> <p>何为适配器模式?</p> <p>适配器模式将一个类的接口适配成用户所期待的。一个适配器通常允许因为接口不兼容而不能一起工作的类能够在一起工作,做法是将类自己的接口包裹在一个已存在的类中。(联想一下现实生活中的各类适配,就比较容易理解了)</p> </li>     <li> <p>如何使用适配器模式?</p> <p>以下情况比较适合使用 Adapter 模式:</p>      <ul>       <li>当你想使用一个已经存在的类,而它的接口不符合你的需求;</li>       <li>你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作;</li>       <li>你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口,对象适配器可以适配它的父亲接口。</li>      </ul> </li>     <li> <p>适配器模式的优缺点?</p> <p>优点:降低数据层和视图层(对象)的耦合度,使之使用更加广泛,适应复杂多变的变化。</p> <p>缺点:降低了可读性,代码量增加,对于不理解这种模式的人来说比较难看懂。</p> </li>     <li> <p>github示例代码</p> <a href="/misc/goto?guid=4959738588210760717" rel="nofollow,noindex">ios设计模式之适配器模式</a></li>    </ol>    <p>策略模式</p>    <ol>     <li> <p>何为策略模式?</p> <p>策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。</p> </li>     <li> <p>如何使用策略模式?</p> <p>在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。</p>      <ul>       <li>如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。</li>       <li>一个系统需要动态地在几种算法中选择一种。</li>       <li>如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。</li>       <li><strong>注意事项</strong> :如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。</li>      </ul> </li>     <li> <p>策略模式的优缺点?</p> <p>优点:简化操作,提高代码维护性。算法可以自由切换,避免使用多重条件判断,扩展性良好。</p> <p>缺点:在使用之前就要确定使用某种策略,而不是动态的选择策略。策略类会增多,所有策略类都需要对外暴露。</p> </li>     <li> <p>github示例代码</p> <a href="/misc/goto?guid=4959738588294086902" rel="nofollow,noindex">ios设计模式之策略模式</a></li>    </ol>    <p>观察者模式</p>    <ol>     <li>何为观察者模式?<br> 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。</li>     <li>如何使用观察者模式?<br> 一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。</li>     <li>观察者模式的优缺点?<br> 优点:1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。<br> 缺点:1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。</li>     <li>gitHub示例代码<br> <a href="/misc/goto?guid=4959738588386853407" rel="nofollow,noindex">iOS设计模式之观察者模式</a></li>     <li><strong>设计模型图</strong> (在敲代码的时候要多想想这个模型图)</li>    </ol>    <p style="text-align:center"><img src="https://simg.open-open.com/show/cbc817b368ed365205cfb9ae73c9e55b.png"></p>    <p>观察者模型图.png</p>    <p>原型/外观模式</p>    <ol>     <li>何为原型/外观模式?</li>     <li>如何使用原型/外观模式?</li>     <li>原型/外观模式的优缺点?</li>    </ol>    <p>装饰模式</p>    <ol>     <li>何为装饰模式?</li>     <li>如何使用装饰模式?</li>     <li>装饰模式的优缺点?</li>    </ol>    <p>工厂模式</p>    <ol>     <li>何为工厂模式?</li>     <li>如何使用工厂模式?</li>     <li>工厂模式的优缺点?</li>    </ol>    <p>桥接模式</p>    <ol>     <li>何为桥接模式?</li>     <li>如何使用桥接模式?</li>     <li>桥接模式的优缺点?</li>    </ol>    <p>代理模式</p>    <ol>     <li>何为代理模式?</li>     <li>如何使用代理模式?</li>     <li>代理模式的优缺点?</li>    </ol>    <p>单例模式</p>    <ol>     <li>何为单例模式?</li>     <li>如何使用单例模式?</li>     <li>单例模式的优缺点?</li>    </ol>    <p>备忘录模式</p>    <ol>     <li>何为备忘录模式?</li>     <li>如何使用备忘录模式?</li>     <li>备忘录模式的优缺点?</li>    </ol>    <p>生成器模式</p>    <ol>     <li>何为送生成器模式?</li>     <li>如何使用生成器模式?</li>     <li>生成器模式的优缺点?</li>    </ol>    <p>命令模式</p>    <ol>     <li>何为命令模式?</li>     <li>如何使用命令模式?</li>     <li>命令模式的优缺点?</li>    </ol>    <p>组合模式</p>    <ol>     <li>何为适配器模式?</li>     <li>如何使用适配器模式?</li>     <li>适配器模式的优缺点?</li>    </ol>    <h2>总结</h2>    <ol>     <li>代码建议有兴趣的同学可以自己敲一遍,便于加深理解。如果觉得github代码还不错请不要吝惜star,每一个star都是我坚持走下去的动力,三克油。</li>     <li>每种设计模式都是有特定的使用背景的,在设计之前要多加进入‘上帝模式’,站的更高才能看的更远。</li>     <li>本文的13中设计模式只是比较常用的一些设计模式,还有其他的一些设计模式,希望不喜勿喷。</li>     <li>如果有什么建议请多多留言,我会一一回复的。</li>    </ol>    <p> </p>    <p>来自:http://www.jianshu.com/p/9c4a219e9cf9</p>    <p> </p>