设计模式之模板方法

来源:互联网 发布:javascript正则应用 编辑:程序博客网 时间:2024/05/21 14:47

设计模式之——模板方法

  • 模式定义
    模板方法模式在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤,模板就是一个方法,这个方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现,这可以确保算法的结构保持不变,同时由子类提供部分实现。
    AbstractClass{
    public void final templateMethod(){
    operation();
    primitiveOperation1();
    primitiveOPeration2();
    }
    operation(){…}
    abstract primitiveOperation1();
    abstract primitiveOperation2();
    }
    ConcreteClass extends AbstractClass{
    abstract primitiveOperation1(){…}
    abstract primitiveOperation2(){…}
    }
    在上面的实例中,AbstractClass类包含了模板方法templateMethod(),这个模板方法所用到的操作有一部分是基类提供的(operation()方法),也由一部分是定义为抽象方法(primitiveOperation1(),primitiveOperation2()方法),模板方法在实现算法的过程中用到了两个抽象方法,具体的方法实现会由子类提供,这使模板方法本身和这两个具体的实现之间被解耦了,当然子类也可能有多个。每一个都实现了模板方法所需的全部操作,当模板方法需要抽象方法时会调用他们子类的实现,
  • 对模板方法记性挂钩
    钩子是一种被声明在抽象类中的方法,但是只有空的默认值或者默认的实现,钩子的存在,可以使子类有对算法的不同点进行挂钩,但具体是否挂钩需要由子类决定,
    AbstractClass{
    public void final templateMethod(){
    primitiveOperation1();
    primitiveOPeration2();
    if( hook() ){
    operation();
    }
    }
    operation(){…}
    abstract primitiveOperation1();
    abstract primitiveOperation2();
    hook(){return true;}
    }
    我们在模板方法中添加了一个判断语句,当条件成立时才执行operation()方法,子类可以覆盖这个方法以达到控制算法的步骤,但不见得所有的子类都需要这样做

  • JAVA中的实例
    数组的排序方法Arrays.sort(),其自己的实现中就是一种模板方法的变形,sort方法会调用mergeSort()方法,在mergeSort()方法中会调用传入数组包含的对象的compareTo方法,所以当我们想要对一种对象进行排序时我们可以在对象的类定义中实现compareTo方法,供mergeSort()方法调用,sort方法就是一个模板方法,它包含了排序算法,并且完全控制算法的步骤,此算法依赖compareTo()方法的实现来完成算法。
    它与我们上面写的经典模板方法模式不一样之处在于它的实现不是依托继承,sort方法的设计者希望这个方法能使用于所有的数组,所以他把sort方法改为了静态方法,这样一来,任何数组都可以使用这个方法,因为sort并不是真正意义的定义在超类中,所以sort方法需要知道你已经实现了这个compareTo方法,否则就无法进行排序。

  • 编程原则
    别调用我们,我们会调用你。
    这个编程原则可以防止依赖腐败,当高层组件依赖底层组件,而低层组件又依赖高层组件,高层组件又依赖边侧组件,边侧组件又依赖低层组件时,依赖腐败就发生了,这样的设计会使系统难以理解,在这个原则中,我们允许低层组件将自己挂钩到系统中,但是高层组件会决定什么时候和怎样使用这些低层组件,低层组件绝对不可以直接调用高层组件。

原创粉丝点击