`

关于模式

阅读更多

     关于模式,相信大家均有自己的感性认识。所谓模式无非是特定场景用特定方法,且该场景可重现。正如现实世界中我们读书学习、相互交流、出国考察等,均是为了找寻模式丰富大脑的知识以待后用。不过,我们人类的活动并不仅仅局限在已有的模式中,因为我们更期待用好、用精模式,并且有创造模式的能力。

     当然,关于模式自然有官方较为精确的定义,比如建筑领域大师Christopher Alexande说:“每一个模式描述了一个在我们周围不断重复发生的问题,以及给问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必重复劳动Alexander所指的这种城市和建筑模式的思想也同样适用于软件领域的设计模式,90年代前期便有很多人从事软件设计模式的工作,由GOF 整理23中设计模式至今影响深远

     一般而言一个设计模式有四个基本要素:模式名称、问题、解决方案和效果。其中,模式名称为助记名,能用简短的词语描述模式的问题、解决方案和效果;问题描述了应该在何时使用模式;解决方案是对问题的处理,描述了设计的组成成分,它们之间的相互关系以及各自的职责和相互关系;效果描述了模式应用的效果及使用模式应权衡的问题

      那么,我们将如何快速学习好并掌握好模式呢?

       简而言之,理解模式的核心在于重用&开-闭。关于重用,从重用的粒度上看,可归类为代码级、方法级、模板级、模块级以及框架级,它的发展路线上抽象层次越来越高&重用粒度越来越大(设计模式主要是思想上的重用,涉及到上面提及重用粒度中的一种或多种),重用的目的就是为了降低代码冗余(避免开发中存在ctr+c&ctrl+v借用代码的坏味道);关于开-闭,主要是指对系统功能扩充开发&对代码修改关闭,它的目的在于追求功能的扩充尽量不影响原有系统。

       接下来的问题是怎样保证重用原则和开-闭原则?

       一般而言,重用原则主要是通过良性设计、代码上移&数据下移的思想来保证,而开-闭原则是通过依赖倒转、接口隔离、迪米特原则、里氏替换原则、组合/聚集等思想来保证。

       由此可见,我们理解模式的核心在于思考以下几点:

      1、模式所属类别;
      2、模式四要素:模式名、场景、解决之道、效果;
      3、重用原则(代码上移&数据下移);

      4、开-闭原则(依赖倒转、接口隔离、迪米特原则、里氏替换原则、组合/聚集)。

       这里重点阐述下重用原则的代码上移&数据下移。对于代码上移&数据下移来达到重用的目的这一观点相信大家都可以理解,但这里隐藏了一个问题,那就是实现。java中的这种实现无非借助于(抽象)类和接口,为了达到代码上移&数据下移的目的,我们不得不需要将焦点转移到java抽象类与接口的异同探讨上来。

       首先,什么是Java接口?它有哪些特性?它的价值是什么?

       JAVA接口:一些方法特征的集合。JAVA接口--在Java语言中存在的结构,有特定的语法和结构;而一般接口--仅仅指一个类所具有的方法的特征集合,是一种逻辑上的抽象;
      JAVA接口特性:1、方法默认public;2、属性默认public static final;3、仅是方法签名,无实现;4、一些看上去毫不相干的类,可以因为提供相类似的服务,从而具有相同的接口;(常见的接口有:单方法接口、标识接口、常量接口)

      JAVA接口价值:若没有Java接口,便无法做到对可查入性的保证(继承,不支持多继承,无法彻底保证可插入性){面向接口编程}
     其次,什么是抽象类?它有哪些特性?

       抽象类:代表一个抽象的概念,代表一个类型的实现;
       抽象类特性:1、可以有实例变量,1或n个构造子;2、可以同时有抽象方法和具体方法;3、不可以自我实例化;

      再次,java接口与抽象类间有何关系?

      1、多继承--接口允许多继承,类不允许;2、商业方法--接口仅为特征签名,而类允许存在实现;

      最后,对于开发,现代观点是面向接口(抽象)编程,组合优于继承,那么,我们要怎么做呢?其实很简单,这条仅是经验推荐原则(最佳实践),就是多学习、多积累。

      比如下面采用接口与抽象混用的方式解决多继承与代码上移:

   

    这样设计的特点是通过抽象层(水果、蔬菜)对接口的实现,达到代码上移&数据下移目的的同时,实现了蔬菜类西红柿变身水果类的多继承

    工作久了,时间紧了,人也懒了,懒得将大脑中汇总的知识形成于文,然随着时间的流逝,有些渐被淡忘,事后想来,多少是种损失,有点遗憾。为了有所弥补,便打算做个备忘于此。

    以上是对模式的一些简单阐述,为的就是Pattern栏目做个铺垫,在未来的将着重讲述下GOF 23模式的自我理解,做个简单备份吧   

1
2
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics