深入浅出设计模式(二)

      上篇博客中,我们介绍了设计模式的基础,本篇博客我们将为大家介绍几种常用的设计模式。

     常用的设计模式有23种,这二十多种大致可以分为三类:创建型、结构型、行为型。下面看一张分类图:

 

      我们先看创建型模式:

    

再看结构型模式:

 

最后看行为模式:

    

看了以上的图,我们能对设计模式有个大体的了解。下面我们重点介绍几种常用的设计模式。

(一)适配器模式

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

      系统的数据和行为都正确,但接口不符时,我们应该考虑适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现场的类,但是接口又与复用环境要求不一致的情况。

        适配器分为对象适配器和类适配器,下面比较一下这两个适配器的差别:

        对象适配器:使用组合,不仅可以适配某个类,也可以适配该类的任何子类;使用组合多于继承;

        类适配器:不需要重新实现整个被适配者,必要的时候可以覆盖被适配者的行为,因为用的是继承;使用时仅仅需要一个类适配器,不需要一个适配器和一个被适配者;

(二)外观模式

         外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

      我们来比较一下外观模式与适配器模式:

       外观模式:没有封装子系统的类,外观只提供简化的接口,所以客户如果觉得有必要,依然可以直接使用子系统的类;在提供简化接口的同时,依然将系统完整的功能暴露出来,以供需要的人使用;外观模式也允许你将客户实现从任何子系统中解耦;

        适配器模式:适配器将一个或多个类接口变成客户所期望的一个接口

需要注意的是:外观模式不只是简化了接口,也将客户从组件的子系统中解耦;外观模式和适配器模式可以包装许多类,但是外观的意图是简化接口,而适配器的意图是将接口转换称不同接口

(三)观察者模式

       观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

       观察者模式应用范围很广,观察者模式定义了对象间一对多的关系;主题(也就是可观察者)用一个共同的接口来更新观察者;观察者和可观察者之间用松耦合方式结合,可观察者不知道观察者的细节,只知道观察者实现了观察者接口;使用此模式时,你可从被观察者处推Push或拉Pull数据(一般用推);当有多个观察者时,不可以依赖特定的通知次序;Java有多种观察者模式的实现,包括了通用的Java.util.Observable;要注意Java.util.Observable实现上所带来的一些问题;如果有必要的话,可以实现自己的Observervale;Swing大量使用观察者模式,许多GUI框架也是如此。

   

(四)策略模式

         策略模式(Strategy):它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响使用算法的客户。

(五)模版方法模式

       模版方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

   

      下面我们比较一下模版方法模式和策略模式:

       模版方法模式:定义了一个算法的大纲,由子类定义其中某些步骤的内容,算法中的个别步骤可以有不同的实现细节,但是算法的结构依然维持不变;

         策略模式:定义了一个算法家族,并让这些算法可以互换,客户可以轻易地使用不同的算法;通过对象组合的方式,让客户可以选择算法实现;在客户端灵活;

          模版方法模式的特点是可以使用钩子。钩子是一种被声明在抽象类中的方法,但只有空的或者默认的实现。钩子的存在可以让子类有能力对算法的不同点进行挂钩,要不要挂钩由子类决定。

          钩子可以让子类实现算法中可选的部分,或者在钩子对于子类的实现并不重要的时候看,子类可以对钩子置之不理;钩子还可以让子类能够有机会对模版方法中某些即将发生的步骤做出反应。

(六)工厂方法模式

          工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化那一个类。工厂方法使一个类的实例化延迟到其子类。

    

           工厂方法模式中所有的工厂都是用来封装对象的创建;工厂方法使用继承:把对象的创建委托给子类,子类实现工厂方法来创建对象;所有工厂模式都通过减少应用程序和具体类之间的依赖促进松耦合。工厂方法模式其实是模版方法模式的一个特殊实例。

            博客更新中,敬请期待!

作者信息见(http://klxdblog.blog.163.com/

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值