设计模式之模板方法模式---封装算法。


春水初生
春林初盛
春风十里
不如你。


模板方法模式:

  1. 俗称概念:在一个方法中定义一个算法的骨架,而把其中的一部分延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤(重写算法骨架中的部分方法)。
    模板方法定义了一个算法的步骤,并且允许子类为一个或多个步骤提供实现。
  2. 这个模板方法中maybe包含:(泡茶和咖啡的栗子中,是这样来实现模板方法模式的)
    (1)抽象方法(让子类来实现);
    (2)final方法(防止被子类重写,但子类公用);
    上面说的也就是模板方法模式的精髓。将模板父类进行骨架修改,将子类中共有的方法定义在父类中,而相似却不共有的定义为抽象方法,让子类来重写(即延迟到子类中实现)。
    总:模板方法的抽象类可以定义具体的方法、抽象方法和钩子。
  3. 代码举栗子:
//排序鸭子
public static void sort(Object[] a){
    Object aux[] = (Object[])a.clone();
    mergeSort(aux,a,0,a.length,0);
}

//mergeSort依赖compareTo()方法的实现来完成算法,所以我们可以重写这个compareTo方法,以弥补模板方法的缺憾
private static void mergeSort(Object src[],Object dest[],int low,int hight,int off){
    for(int i = low; i<high; i++){
        ((Comparable)dest[j-1]).compareTo((Comparamble)dest[j]>0; j--){
            swap(dest,j,j-1);   
        }       
    }
    return;
}

//compareTo方法是Comparable接口中的一个方法,所以我们让使用sort的类来重写这个compareTo方法,就能实现sort排序啦
public class Duck implents Comparable{
    String name;
    int weigh;

    public Duck(String name,int weigh){
        this.name = name;
        this.weigh = weigh;
    }

    public String toString(){
        return name + "weigh:" + weigh;
    }

    public int comparaTo(Object object){
        Duck otherDuck = new Duck();
        if(this.weight < otherDuck.weigh){
            return -1;
        }else if(this.weight = otherDuck.weigh){
            return 0;
        }else(//this.weight > otherDuck.weigh){
            return 1;
        }
    }
}

//现在就可以进行排序了
public class DuckSortTest{
    public static void main(String[] args){
        Duck[] ducks = {
                new Duck("zhyu",2),
                new Duck("zddd",8),
                new Duck("zhhu",5),
                new Duck("zhhh",9),
                new Duck("zggg",1)              
            };
        Array.sort(ducks);
    }
}
  1. 这里提到了一个“钩子”,钩子就是站在父类中有一定的定义实现,但是子类也可以覆盖它的实现。如果在算法中,这部分的算法实现是可选的,就用钩子。

好莱坞原则

别调用我们,我们会调用你。
目的:为了防止“以来腐败”。高层组件、底层组件、边侧组件之间相互依赖的话,我们并不能搞懂代码到底是怎么设计的,比较混乱。好莱坞原则允许底层组件将自己挂钩到系统上,但是高层组件决定什么时候和怎么样使用底层组件。
好莱坞原则是用在创建框架或组件上的一种技巧,让底层组件能够被挂钩到计算中,而又不让高层组件依赖底层组件。


策略模式和模板方法模式都封装算法,一个用组合,一个用继承。
工厂方法是模板方法的一种特殊版本。(工厂方法是 定义的父类中,包含:相似方法的抽象方法定义 以及 公有方法提供子类通用。 其中这个抽象方法延迟到子类中去实现。而模板方法模式中的父类:将共有的方法定义为final防止子类重写,再提供抽象方法延迟到子类实例化。其实很相似…

那么,模板方法模式比工厂方法不一样的地方在哪里呢?

猜你喜欢

转载自blog.csdn.net/amethyst128/article/details/78523422