首页 > 代码库 > 课堂作业06_23种设计模式

课堂作业06_23种设计模式

设计模式广泛用于面向对象的开发和设计中,成为面向对象的重要组成部分。设计模式只在一定的抽象层次上讨论模式。设计模式作为一个专有名词,特指在特定场景下解决一般设计问题的类和相互通信的对象的描述。像链表、hash表这样的设计,一般不称作设计模式,而那些包括复杂的、特定领域内的对整个应用或子系统的架构的设计也不是设计模式所讨论的范围 。

设计模式的定义为:设计模式是一种被反复使用、多人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被人理解、保证代码的可靠性。设计模式是软件工程的基石,如同大厦的一块块砖石一样。设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。

设计模式根据目的可分为:创建型、结构型、行为型。创建型模式主要用于创建对象;结构型模式主要用于处理类和对象的组合;行为型模式主要用于描述对类或对象怎么交互和怎么分配职责。

创建型模式:

1.简单工厂

简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

2.工厂方法模式

    是简单工厂模式的延伸。工厂父类负责定义创建产品对象的公共接口,而子工厂负责具体生产具体的产品对象。所谓的决定并不是批模式允许子类本身在运行时做决定,而是指在编写创建者类时,不需知道创建的产品是哪一下,选择了使用哪个子类,就决定了实际创建的产品是什么。

3.抽象工厂模式

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。主要解决接口选择的问题。

4.建造者模式

将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。主要解决:在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

5.原型模式

用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。既能用于创建重复的对象,同时又能保证性能。主要解决:在运行期建立和删除原型。

6.单例模式

    保证一个类仅有一个实例,并提供一个访问它的全局访问点。主要解决:一个全局使用的类频繁地创建与销毁。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

结构型模式

1.适配器模式

将一个接口转化为客户希望的另一个接口,适配器模式使接口不兼容的类一起工作。是两个不兼容类的桥梁。主要解决:在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。

例如:加密模块在此基础上实现在不修改现有类的基础上重用第三方加密方法。

2.桥接模式

将抽象部分与实现部分分离,使它们都可以独立的变化。主要解决:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。

例如:跨平台视屏播放器。

3.组合模式

组合多个对象形成树形结构以表示“整体-部分”的结构层次。组合模式使得用户对单个对象和组合对象的使用具有一致性。主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

例如:文件夹的树形结构访问。

4.装饰模式

动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。

例如:在原有基础上实现多重加密。

5.外观模式

为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口。

例如:文件加密。加密的过程包括三个操作:读取文件、加密、保存加密之后文件。

6.享元模式

运用共享技术有效地支持大量细粒度的对象。主要解决:在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。

7.代理模式

    为其他对象提供一种代理以控制对这个对象的访问。主要解决:在直接访问对象时带来的问题。

行为型模式

1.职责链模式

避免请求发送方与接收方耦合在一起,让多个对象都可以接收请求,将这些对象连接一条链,并且沿着这条链传递请求,直到有对象处理它为止。主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。

例如:按级别进行请假处理。

2.命令模式

    将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。

主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。

    例如:撤销操作的实现

3.解释器模式

    给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。主要解决:对于一些固定文法构建一个解释句子的解释器。

4.迭代器模式

提供了一种方法访问聚合对象,而不用暴露这个对象的内部表示。主要解决:不同的方式来遍历整个整合对象。主要解决:不同的方式来遍历整个整合对象。

    例如:电视遥控器实现对电视频道集合遍历操作。

5.中介者模式

    中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。

6.备忘录模式

    在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。主要解决:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。

7.观察者模式

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

    例如:猫是老鼠和狗的观察目标,老鼠和狗是观察者,猫叫则老鼠跑,够野跟着叫。

8.状态模式

允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。

主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。

9.策略模式

定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。

10.模板方法模式

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。主要解决:一些方法通用,却在每一个子类都重新写了这一方法。

11.访问者模式

主要将数据结构与数据操作分离。主要解决:稳定的数据结构和易变的操作耦合问题。

课堂作业06_23种设计模式