1. 聚能聊>
  2. 话题详情

聊聊设计模式,封装算法——模板方法模式

前面我们聊了:
什么是设计模式?你知道多少?
你必须知道的六大设计原则
第一个设计模式,我是皇帝我独苗,单例模式
第二个设计模式,工厂方法模式
第三个设计模式,抽象工厂模式
这个真的很枯燥啊,大家参与的很少,但是你只要按格式认真参与,得到奖品的机会可能更高哦!
今天我们来聊聊第四个设计模式,模板方法模式。
image
模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。(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、有一个设计模式和模板方法模式很像,你知道它是什么模式吗?它们有什么相似与不同?

参与话题

奖品区域 活动规则 已 结束

  • 奖品一

    云栖定制鼠标垫 x 2

4个回答

2

饭娱咖啡 已获得云栖定制鼠标垫 复制链接去分享

题外话:聊主要坚持住,我的设计模式都是在你这学的。

1、一般模板方法都会加上一个关键字,你知道是什么吗?作用目的是什么?
一般都加上final关键字。作用:防止被覆写

2、模板方法模式可以扩展,使用钩子,你能指出示例中对应功能的代码吗?
这里的钩子,用于控制方法的执行。

    protected boolean isDoSomething(){ //父类方法返回真
        return true;
    }

3、有一个设计模式和模板方法模式很像,你知道它是什么模式吗?它们有什么相似与不同?
策略模式。
相似的地方:都是对代码进行了封装、重用。
不同的地方:模板方法侧重于业务,策略模式侧重于算法。

1

海阔天空yy 已获得云栖定制鼠标垫 复制链接去分享

1、一般模板方法都会加上一个关键字,你知道是什么吗?作用目的是什么?
abstract ,用这个修饰的类,不能实例化为对象,只能被基它类继承。
内部方法,可以实现一部分,也可以不实现。
主要是你可以定义一些骨架,使用的人去继承这个骨架,再去增加适合自己的逻辑。

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

public class ConcreteClass2 extends AbstractClass {

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

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

}


3、有一个设计模式和模板方法模式很像,你知道它是什么模式吗?它们有什么相似与不同?
应该是工厂模式吧,都有点类似是一个模子出来的感觉。
感觉工厂模式是统一生产对象的,
模板模式是,定义了一些骨架,但你可以用这个顾家去建楼,还是建体育场。对象可以差别很大。

0

浮生递归 复制链接去分享

貌似太专业了……没人参与,哈哈

微wx笑 回复

努力失败,问题还要再简化

评论
0

gallely 复制链接去分享

封装算法,将相同的代码封装到一个方法中,这就是模板方法模式。