美文网首页
模版设计模式

模版设计模式

作者: gczxbb | 来源:发表于2019-05-31 20:50 被阅读0次

一、概念介绍

在父类中定义一个操作流程,该流程的每一步骤是固定的,步骤中具体的事情实现方法(算法)交给子类完成。
模版方法,父类定义一套固定的方法,自己没实现,让子类实现,每个子类只需要实现父类的方法,父类已经安排好执行的步骤。
比如,父亲有一些梦想没有实现,没上过大学,很遗憾,该梦想由一系列具体的小梦想步骤组成,让孩子去完成这个梦想。

public abstract class FatherClass {
    //父亲的梦想模版
    public final void lifeDream(){
        //出生
        doUniversity();
        doGraduate();
        doDoctor(); 
    }
    public void doUniversity() {
        //父亲未读大学,空方法
    }
    //读研
    public abstract void doGraduate();
    //读博
    public abstract void doDoctor();
}

lifeDream步骤确定,do大学,do研究生,do博士,一步步来。doXxx抽象方法,子类去实现。

public class ChildClass extends FatherClass{
    //按照父亲设定的梦想上大学
    @Override
    public void doUniversity() {
        //学习
    }

    //按照父亲设定的梦想做研究
    @Override
    public void doGraduate() {
        //研究
    }
    
    //按照父亲设定的梦想读博士
    @Override
    public void doDoctor() {
        //继续研究
    }
}

子类,doXxx方法,具体的实现,在大学研究生博士做具体的事情,最终达成目的。

二、在Android中的应用

在Android系统,测量、布局、绘制过程,使用模版设计模式,View基类提供一套测量、布局和绘制的模板步骤,每个子类View负责测量、布局、绘制的具体实现。
视图测量
measure方法,基类View提供的测量方法,final关键字修饰,子类无法重写。树结构中每个视图的测量,都先调用此方法,测量流程中调用onMeasure方法。
View类提供一个默认onMeasure方法,子类重写该方法,实现具体的测量。

模版方法,measure方法。
onMeasure方法,子类实现。

视图布局
layout方法,基类View提供的布局方法,final关键字修饰,子类不能重写。
ViewGroup的layout方法,调用父类View的layout方法,该方法实现了一套布局流程。

@Override
public final void layout(int l, int t, int r, int b) {
    if (!mSuppressLayout && (mTransition == null || !mTransition.isChangingLayout())) {
        if (mTransition != null) {
            mTransition.layoutChange(this);
        }
        super.layout(l, t, r, b);
    } else {
        mLayoutCalledWhileSuppressed = true;
    }
}

View的layout方法,保存该视图本身在父视图中的Rect区域,上下左右四个入参,调用onLayout方法,实现内部子视图布局,View类不需要给子视图布局,该方法在View类中是空。
onLayout方法,View类是空方法,ViewGroup类是抽象方法,ViewGroup子类实现具体布局,只有ViewGroup类型需要为子视图布局。

举例视图布局

举例,一个LinearLayout类视图,两个ImageView类型子视图。
在布局时,LinearLayout类是ViewGroup的子类,调用父类ViewGroup的layout方法,super类layout方法,即View类layout方法,将它自己在父视图坐标区域入参保存,然后,调用onLayout方法,LinearLayout类重写,布局两个子视图。

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    if (mOrientation == VERTICAL) {
        layoutVertical(l, t, r, b);
    } else {
        layoutHorizontal(l, t, r, b);
    }
}

遍历调用child视图ImageView的layout方法,基类View的layout方法,入参是每个ImageView在LinearLayout中的Rect区域,保存到子视图ImageView内部,然后,调用ImageView的onLayout方法,ImageView是View类型,未重写onLayout方法。

模版,layout方法,View类定义模板。
onLayout方法,ViewGroup的子类实现,View类未实现。

视图绘制
draw方法,基类View提供的绘制方法。
onDraw方法,View类空方法,子类重写,具体绘制。
dispatchDraw方法,View类空方法,ViewGroup实现,绘制分发。
每一个View类的draw方法,绘制步骤是onDraw方法,dispatchDraw方法。View子类实现onDraw方法,dispatchDraw方法是派发,遍历每个子视图draw方法,在ViewGroup类实现一次,它的子类不需要重写。

模版方法,draw方法。
onDraw方法,子类实现,dispatchDraw方法,ViewGroup类实现。

模版设计模式,通过继承,改变父类工序中其中一道流程的实现方法。


任重而道远

相关文章

  • 设计模式-模版方法模式

    设计模式-模版方法模式 定义 模版方法模式(Template Method Pattern)又叫模版模式,是指定义...

  • 听欢哥来扒一扒PHP的设计模式

    设计模式的宗旨就是:重用。 在面向对象中,类是用于生成对象的代码模版,而设计模式是用于解决共性问题的代码模版。 遵...

  • 设计模式(模版方法模式)

    模版方法重在一气呵成的流程。模版方法模式是以类继承的方式表现:1.模版基类,定义了方法组的调用顺序。2.对应具体类...

  • 设计模式——模版方法模式

    在阎宏博士的《JAVA与模式》一书中开头是这样描述模板方法(Template Method)模式的:模板方法模式是...

  • 设计模式-模版方法模式

    模版方法模式 定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算...

  • 设计模式-模版方法模式

    定义 定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些...

  • 设计模式-模版方法模式

    一、定义 模版方法模式是一种对象行为模式。定义一个抽象类,将部分逻辑以具体方法(算法骨架)及具体构造函数的形式实现...

  • 设计模式--模版模式

    设计模式--模版模式 涉及到的知识点Java 的接口和抽象类信息一个类只可以继承另外一个类,但是可以实现多个接口抽...

  • 设计模式-模版方法模式

  • 设计模式——模版方法

    模版方法 顾名思义,模版方法就是定义一个模版,模版里面有具体的步骤。某些步骤在父类定义,然后由子类去实现。 优化 ...

网友评论

      本文标题:模版设计模式

      本文链接:https://www.haomeiwen.com/subject/ttlltctx.html