Android知识Android技术知识Android开发

模板方法模式

2017-04-18  本文已影响48人  程序员丶星霖

模板方法模式

定义

定义一个操作中算法的骨架(或称顶级逻辑),将一些步骤的执行延迟到其子类中,使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
(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 .)

模板方法模式的通用类图如下所示:

模板方法模式.jpg

上图中所涉及的角色:

模板方法模式中的AbstractClass叫做抽象模板,它的方法可以分为两类:

注意:

  1. 为了方法恶意操作,一般模板方法都加上final关键字,不允许被覆写。
  2. 抽象模板中的基本方法尽量设计为protected类型,符合迪米特法则,不需要暴露的属性或方法尽量不要设置为protected类型。实现类若非必要,尽量不要扩大父类中的访问权限。

示例代码如下所示:

//抽象模板类
public abstract class Model{
    
    protected abstract void start();

    protected abstract void stop();

    protected abstract void alarm();

    protected abstract void engineBoom();

    final public void run(){

        this.start();

        this.engineBoom();

        this.alarm();

        this.stop();
    }

}
public class H1Model extends Model{

    protected abstract void start(){

    }

    protected abstract void stop(){

    }

    protected abstract void alarm(){

    }

    protected abstract void engineBoom(){

    }
}
public class H1Model extends Model{

    protected abstract void start(){

    }

    protected abstract void stop(){

    }

    protected abstract void alarm(){

    }

    protected abstract void engineBoom(){

    }

}

优缺点

优点:

缺点:

使用场景:

扩展

父类怎么调用子类的方法?

但是在项目中并不允许这么使用,使用模板方法模式就可以产生一样的效果。

UML图示如下所示:

模板方法模式扩展.jpg

扩展的代码如下:

//抽象模板类
public abstract class Model{
    
    protected abstract void start();

    protected abstract void stop();

    protected abstract void alarm();

    protected abstract void engineBoom();

    final public void run(){

        this.start();

        this.engineBoom();

        if(this.isAlarm()){
            this.alarm();
        }

        this.stop();
    }

    //钩子方法
    protected boolean isAlarm(){
        return true;
    }
}
public class H1Model extends Model{
    
    private boolean alarmFlag = true;

    protected abstract void start(){

    }

    protected abstract void stop(){

    }

    protected abstract void alarm(){

    }

    protected abstract void engineBoom(){

    }

    //钩子方法
    protected boolean isAlarm(){
        return this.alarmFlag;
    }

    //要不要执行alarm()方法由客户来决定
    public void setAlarm(boolean isAlarm){
        this.alarmFlag = isAlarm;
    }
}
public class H1Model extends Model{

    protected abstract void start(){

    }

    protected abstract void stop(){

    }

    protected abstract void alarm(){

    }

    protected abstract void engineBoom(){

    }

    //钩子方法
    protected boolean isAlarm(){
        return false;
    }

}

欢迎大家关注我的微信公众号!

我的微信公众号.jpg
上一篇 下一篇

猜你喜欢

热点阅读