【聚能聊话题】聊聊设计模式,封装算法——模板方法模式

前面我们聊了:
什么是设计模式?你知道多少?
你必须知道的六大设计原则
第一个设计模式,我是皇帝我独苗,单例模式
第二个设计模式,工厂方法模式
第三个设计模式,抽象工厂模式
这个真的很枯燥啊,大家参与的很少,但是你只要按格式认真参与,得到奖品的机会可能更高哦!
今天我们来聊聊第四个设计模式,模板方法模式。
【聚能聊话题】聊聊设计模式,封装算法——模板方法模式
模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。(Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure)

看了定义恐怕会很头大,下面是通俗一点的:
在软件开发过程中,如果相同的一段代码复制过两次,就需要对设计产生怀疑,架构师要明确地说明为什么相同的逻辑要出现两次或更多次。
封装算法,将相同的代码封装到一个方法中,这就是模板方法模式。

public abstract class AbstractClass {
    protected abstract void doAnything();
    protected abstract void doSomething();
    protected boolean isDoSomething(){ //父类方法返回真
        return true;
    }
    public final void templateMethod(){
        /*
         * 调用基本方法,完成相关的逻辑
         */
        this.doAnything();
        if(this.isDoSomething())
            this.doSomething();
    }
}
public class ConcreteClass1 extends AbstractClass {
    private boolean isDoSth;
    @Override
    protected void doAnything() {
        // TODO Auto-generated method stub
        //子类实现具体
    }

    @Override
    protected void doSomething() {
        // TODO Auto-generated method stub    
    }
    protected void setDo(boolean isDo){
        this.isDoSth = isDo;
    }

    @Override
    protected boolean isDoSomething(){
        return isDoSth;
    }
}

public class ConcreteClass2 extends AbstractClass {

    @Override
    protected void doAnything() {
        // TODO Auto-generated method stub
        //子类实现具体
    }

    @Override
    protected void doSomething() {
        // TODO Auto-generated method stub    
    }
}

这个模式是用来创建一个算法的模板。什么是模板?如你所见的,模板就是一个方法。更具体地说,这个方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现。这可以确保算法的结构保持不变,同时由子类提供部分实现。

模板方法模式的优点
封装不变部分,扩展可变部分。把认为不变部分的算法封装到父类中实现,而可变部分的则可以通过继承来继续扩展。
提取公共部分代码,便于维护。
行为由父类控制,子类实现。
模板方法模式的缺点
按照设计习惯,抽象类负责声明最抽象、最一般的事物属性和方法,实现类负责完成具体的事务属性和方法,但是模板方式正好相反,子类执行的结果影响了父类的结果,会增加代码阅读的难度。
模板方法模式的使用场景
多个子类有共有的方法,并且逻辑基本相同时。
重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。
重构时,模板方法是一个经常使用的方法,把相同的代码抽取到父类中,然后通过构造函数约束其行为。

今天的话题:
1、一般模板方法都会加上一个关键字,你知道是什么吗?作用目的是什么?

2、模板方法模式可以扩展,使用钩子,你能指出示例中对应功能的代码吗?

3、有一个设计模式和模板方法模式很像,你知道它是什么模式吗?它们有什么相似与不同?

点击链接去参与话题,认真回复就可能获得以下奖品哦!

【聚能聊话题】聊聊设计模式,封装算法——模板方法模式

上一篇:uva 10801 - Lift Hopping(最短路Dijkstra)


下一篇:艾伟也谈项目管理,假如我是一个项目总监/经理