设计模式——初学学习经验

设计模式

各位读者朋友你们好,我是你们的好朋友IT黑铁,在这学期的学习过程中初步认识和学习了设计模式和架构思想。以下内容最全的几个是我当前有点理解的模式,其余内容缺少的还未涉猎。若有错误,还望指教!

学习来源:

《设计模式——可复用面向对象软件的基础》

      软件结构设计课程

引言

面向对象是从整体来思考问题,更接近人的思维,所以其中喜欢用的委托技术就是很直白的体现。自己做不了的事情交给别人完成,即交给其他对象去做。可能会有问题,为什么不直接把事情交给正确的人去做?以人的思维去想,就更容易了解,上层的人不知道这件事谁能做,只有交给他知道的下一级去,直到下一级能直接完成这件事,那么这个过程就叫委托。

继承方式的改变,不再推荐类继承,而推荐接口继承。第一个原因在下一段说明,推荐使用接口继承的原因就是为了多态。在多态性下,新增的功能,不需要改动一个原有的代码,只需新增一个类。并且接口继承规范了方法声明,非抽象类子类继承就必须实现,一定程度的规范了程序员的编程。

为什么不推荐使用类继承?使用继承的原因是为了复用父类的属性行为,但是也引入了三个缺点:(一)僵化:继承自父类,意味着父类限制了子类的行为,丧失了灵活性。(二)类爆炸:当一个功能有多个继承层次,当新增一个功能时将导致新增数个类,类的数量将会变得庞大。(三)编译时策略:在编译时决定了整体的构成,这是致命的,没有为变化留下空间。

对象组合,将其他类作为其成员组合进来,不仅避免了类继承的缺点,还能使用委托。若是结合多态,就再加入了灵活性。

自顶向下,逐步细化。顶:自然思维。底:操作系统API。

一、    单例模式(Singleton)

使用场景:要求对象在内存中只有一个实例,不要求有不同的对象属性。

一句话陈述:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

实现关键细节:将构造方法私有控制,提供一个公共静态的得到实例的方法,在该方法中将保存的唯一实例指针赋给传进来的参数,当然也可以返回指针。不过要进行健壮性控制,如果唯一实例还未创建就调用构造方法创建。

例子:

二、    代理模式(Proxy)

使用场景:对原始对象进行增强功能或者说控制其访问方式。

一句话陈述:为其他对象提供一个代理以控制对这个对象的访问。

实现关键细节:对原对象进行封装,封装后成为了一个代理对象,代理

对象提供对被代理对象的访问逻辑处理方法。

              例子:

             

三、    模板方法模式(Template Method)

使用场景:适用于框架技术,提醒用户需要实现的子功能,剪去固定的细枝末节的相同部分。

一句话陈述:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。

Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

实现关键细节:在一个执行流程里,将要求用户实现的独立功能,作为抽

象方法声明。当用户要实现该整个流程时,需要继承该类,并实现其要求的子功能,不需要管子功能执行的逻辑顺序即其余细枝末节,大大方便了编程。

       例子:

 

四、    观察者模式(Observer)

使用场景:多个相同方法名的不同逻辑需要使用到一个相同对象的功能。

一句话陈述:定义对象间的一种一对多的依赖关系,以便当一个对象的状

态发生改变时,所有依赖于它的对象都得到通知并自动刷新。

       实现关键细节:在一的那方保存多的指针或引用(称为监听器)和对其对应的事件(或者是关键字),在多的那方提供一个回调函数。流程即为,当一的那方保存(注册)了该种指针,每次有事件发生,就去找到该事件对应的指针,调用该指针指向的回调函数。

       例子:

 

五、    组合模式(Composite)

使用场景:将复合对象和单个对象视作相同层次。

一句话陈述:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得客户对单个对象和复合对象的使用具有一致性。

实现关键细节:单个对象和复合对象都继承自同一父类,复合对象由单个对象组合而成。

例子:

六、    工厂方法模式(Factory Method)

使用场景:各子类的属性存在不同,只有子类知道该如何初始化。

一句话陈述:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。

实现关键细节:在父抽象类里声明创造对象的方法,其子类根据自身实现创造不同的对象。为什么非要提取出来?如果不提取出该方法,子类只得在调用该对象前创建对象或在构造方法里重载,只显然是不好的。提取出来后,父类的构造函数可直接调用该方法,不管其实现如何。此外,该模式延迟了实例化,也就避免了类型测试。

例子:

 

七、    原型模式(ProtoType)

使用场景:第一种:用于例子中的情况,不知道如何得到和对象一样的对象。第二种:适用于插件(扩展)功能的实现。

一句话陈述:用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。

实现具体细节:在父抽象类中定义一个复制自己的方法,当外界要得到一个与当前对象相同的对象,即调用该复制方法。需要注意的是,在一个复合对象里,它的引用对象如果不调用其复制方法,复制得到的复合对象的引用对象和原对象的引用对象是同一个,称为浅拷贝;如果调用了其复制方法,就是深拷贝。

例子:

 

 

八、    访问者模式(Visitor)

使用场景: 多对多的情况,某一方多不会扩充。

一句话陈述:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

实现关键细节:前提是被访问的数据对象不会扩充。在访问者中提供一个没有实现具体功能逻辑的方法被外界调用,提供一系列针对不同被访问者的实现逻辑的方法供被访问者调用。即是说,访问者保存了被访问者的指针,外界调用了供外界调用的方法后,在该方法中委托(采访)给被访问者去调用自己知道自己应该调用访问者的正确方法。该模式,也避免了类型测试。

例子:

 

 

九、    策略模式(Strategy)

使用场景:不必为了支持一个新的算法而改变Strategy或它的环境。

一句话陈述:定义一系列的算法,把它们一个个封装起来,并且使它们可

相互替换。本模式使得算法的变化可独立于使用它的客户。

关键细节: 一个未格式化的Composition对象只包含组成文档基本内容的可见图元。它并不包含像行和列这样的决定文档物理结构的图元。 Composition对象只在刚被创建并以待格式化的图元进行初始化后,才处于这种状态。当Composition需要格式化时,调用它的Compositor的Compose操作。 Compositor依次遍历Composition的各个子图元,根据分行算法插入新的行和列图元。

           例子:

 

十、    修饰者模式(Decorator)

一句话陈述:动态地给一个对象添加一些额外的职责。就扩展功能而言, Decorator模式比生成子类方式更为灵活。

    实现关键细节:将修饰成分的对象继承自其内容对象,并且将内容对象组合进来,这被成为透明围栏,外界并不知道里面的组成,修饰和内容被看做一样。其方法就是先执行其内容对象方法逻辑,再执行自身的逻辑。当下一个修饰者编辑时,上一个修饰者也加入了内容对象里,这样就像一个透明的围栏一样。

    例子:

   

十一、抽象工厂模式(Abstract Factory)

使用场景:要创建的对象很多并且这些对象成系列化家族化,这些家族系列通常有多个。

一句话陈述:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

实现关键细节:抽象工厂类声明所有需要创建的产品,其不同子类生成的产品对象都有差别。

例子:

 

十二、桥接模式(Bridge)

一句话陈述:将抽象部分与它的实现部分分离,使它们都可以独立地变化。

实现关键细节:将基本操作的实现封装起来,组合进复杂的逻辑实现对象里,逻辑对象调用的基本操作都来源于封装起来的来自不同实现的类。

例子:

 

十四、适配器模式(Adapter)

一句话陈述:将一个类的接口转换成客户希望的另外一个接口。 Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

十五、构建器模式(Builder)

一句话陈述:将抽象部分与它的实现部分分离,使它们都可以独立地变化。

十六、责任链模式(Chain of Responsibility)

一句话陈述:为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。

十七、Command模式

一句话陈述:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。

十八、Façade模式

一句话陈述:为子系统中的一组接口提供一个一致的界面, F a c a d e模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

十九、Flyweight模式

一句话陈述:运用共享技术有效地支持大量细粒度的对象。

二十、Interpreter模式

一句话陈述:给定一个语言, 定义它的文法的一种表示,并定义一个解释器, 该解释器使用该表示来解释语言中的句子。

二十一、迭代器模式(Iterator)

一句话陈述:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。

二十二、Mediator模式

一句话陈述:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

二十三、Memento模式

一句话陈述:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。

 

posted @ 2022-12-04 20:36  炸天帮达令  阅读(44)  评论(0编辑  收藏  举报