Android设计模式(八)--模板方法模式
到国美面试Android的时候。问我的设计模式相关的问题:
1、单例模式的意义时什么。
2、有哪几种工厂方法模式;
3、你用过的模板方法模式。举例说明;
自己感觉答的一塌糊涂。
模板方法模式都没说出来;
悲剧。
基础不牢。地动山摇。
大公司注重基础,所以对于java 基础,设计模式。算法。
这些是一定坚固的。
1、定义:
定义一个操作算法的骨架,将一些步骤延伸到子类中。
模版方法模式使得子类能够不改变算法结构就可以重定义该算法的某些步骤。
Defines the skeleton of an algorithm in a method, deferring some steps to subclasses.
Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.
2、作用:
通过使用模板方法模式。能够将一些复杂流程的实现步骤封装在一系列基本方法中,在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法的运行次序。而通过其子类来覆盖某些步骤。从而使得同样的算法框架能够有不同的运行结果。
3、模板类,模板方法:
3.1、模板类能够是抽象类,也能够是详细类,依据须要来确定。
3.2、模板类中的模板方法。一定是详细方法,其它方法能够使抽象方法也能够是详细方法;
3.3、通过继承与多态的控制。能够实现子类对父子的反向控制;
4、demo
package com.example.demo.TemplateMethod; import android.util.Log; /**
* 模版方法抽象类
* @author qubian
* @data 2015年6月9日
* @email naibbian@163.com
*
*/
public abstract class TemplateLotteryAbs { /**
* 获取随机数
*/
protected abstract String getRandomNum(int num);
/**
* 处理随即数产生的数据
*/
protected abstract void doLotteryString(String lottery);
/**
* 计算注数
*/
protected abstract void doLotteryNum(); /**
* 是否标红
* @return
*/
public boolean shouldSetStringRed()
{
return false;
} /**
* 标红
*/
protected void SetStringRed()
{
Log.i("TemplateAbs", "SetStringRed");
} /**
* 模板方法:定义在抽象类中,并由子类不加以改动地全然继承下来。 * 模板方法是一个详细方法。它给出了一个顶层逻辑框架,
* 而逻辑的组成步骤在抽象类中能够是详细方法,也能够是抽象方法。
* 因为模板方法是详细方法,因此模板方法模式中的抽象层仅仅能是抽象类,而不是接口。
*
*/
public void doInfo(int num)
{
// 内部控制
doLotteryString(getRandomNum(num));
doLotteryNum(); // 这能够通过 继承覆盖,反向控制父类的方法 if (shouldSetStringRed()) {
SetStringRed();
} } }
详细方法:
package com.example.demo.TemplateMethod; import android.util.Log; /**
* 模板方法子类
* @author qubian
* @data 2015年6月9日
* @email naibbian@163.com
*
*/
public class TemplateLottery extends TemplateLotteryAbs{ private static final String TAG ="TemplateObj"; @Override
protected String getRandomNum(int num) { return "1,2,3,4,5,6";
} @Override
protected void doLotteryString(String lottery) {
Log.i(TAG, "doLotteryString");
} @Override
protected void doLotteryNum() { }
/**
* 反向控制
*/
@Override
public boolean shouldSetStringRed() { return super.shouldSetStringRed();
}
@Override
protected void SetStringRed() { super.SetStringRed();
} }
使用:
package com.example.demo.TemplateMethod; /**
* 使用 模板方法模式
* @author qubian
* @data 2015年6月9日
* @email naibbian@163.com
*
*/
public class UseTemplate { public void use()
{ TemplateLotteryAbs tempObj= new TemplateLottery(); tempObj.doInfo(5);
}
}
7、在Android中的运用:
在Android源代码中,View中的Draw()方法就是一个“模板方法”。
当继承View子类中,假设要重写或者扩展这种方法时,整个方法流程和基本内容不可以改动,
View 视图的构建。都是由View自身实现,当中的算法实现流程都是确定的;
子类仅仅能通过扩展onDraw(Canvas canvas)和dispatchDraw(Canvas canvas)两个函数。使子类自己的View显示效果和别的详细子类的不同。
当中有:TextView类中重写了OnDraw函数。ViewGroup类,SurfaceView重写了dispatchDraw()函数等等。
public class View implements Drawable.Callback, KeyEvent.Callback,
AccessibilityEventSource { /**
* Implement this to do your drawing.
*
* @param canvas the canvas on which the background will be drawn
*/
protected void onDraw(Canvas canvas) {
}
/**
* Called by draw to draw the child views. This may be overridden
* by derived classes to gain control just before its children are drawn
* (but after its own view has been drawn).
* @param canvas the canvas on which to draw the view
*/
protected void dispatchDraw(Canvas canvas) { }
}
public class TextView extends View implements ViewTreeObserver.OnPreDrawListener { @Override
protected void onDraw(Canvas canvas) {
restartMarqueeIfNeeded(); // Draw the background for this view
super.onDraw(canvas); final Drawables dr = mDrawables;
if (dr != null) {
//.....
} int color = mCurTextColor;
mTextPaint.setColor(color);
mTextPaint.drawableState = getDrawableState(); canvas.save();
}
Android设计模式(八)--模板方法模式的更多相关文章
- Android设计模式系列--模板方法模式
模板方法,和单例模式是我认为GOF的23中最简单的两种模式.但是我个人对模板方法的经典思想特别推崇,虽然模板方法在大对数情况下并不被推荐使用,但是这种通过父类调用子类的方法,使用继承来改变算法的一部分 ...
- 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)
原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...
- 折腾Java设计模式之模板方法模式
博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...
- Android 设计模式之MVC模式
说到Android设计模式的MVC模式,估计很多人都是比较熟悉了,这里深入了解一下MVC到底是怎么回事,以ListView为例子讲解. 一.深入理解MVC概念 MVC即Model-View-Contr ...
- js设计模式——6.模板方法模式与职责链模式
js设计模式——6.模板方法模式与职责链模式 职责链模式
- 《Android源码设计模式》--模板方法模式
No1: 模板方法模式包括:抽象类(其中定义了一系列顺序方法).具体实现类A.具体实现类B 如果子类有实现不一样的细节,重写父类的某个方法即可 No2: AsyncTask对象调用execute方法后 ...
- 从西天取经的九九八十一难来看Java设计模式:模板方法模式
目录 示例 模板方法模式 定义 意图 主要解决问题 适用场景 优缺点 西天取经的九九八十一难 示例 当我们设计一个类时,我们能明确它对外提供的某个方法的内部执行步骤, 但一些步骤,不同的子类有不同的行 ...
- Android设计模式之命令模式、策略模式、模板方法模式
命令模式是其它很多行为型模式的基础模式.策略模式是命令模式的一个特例,而策略模式又和模板方法模式都是算法替换的实现,只不过替换的方式不同.下面来谈谈这三个模式. 命令模式 将一个请求封装为一个对象,从 ...
- java设计模式之模板方法模式
模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差 ...
- C#设计模式(14)——模板方法模式(Template Method)
一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简 ...
随机推荐
- Spring 概念详解
一.Spring的IoC(Inversion of Control). 这是Spring中得有特点的一部份.IoC又被翻译成“控制反转”,也不知道是谁翻译得这么别扭,感觉很深奥的词.其实,原理很简单, ...
- [BZOJ2669][CQOI2012]局部最小值(容斥+状压DP)
发现最多有8个限制位置,可以以此为基础DP和容斥. $f_{i,j}=f_{i-1,j}\times (cnt_j-i+1)+\sum_{k\subset j} f_{i-1,k}$ $cnt_j$表 ...
- 【BFS】Pots
[poj3414]Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16925 Accepted: 7168 ...
- [转]SSH包全解
Struts2 Core Libraries 必须引入的包 : struts2-core.jar——Struts2的核心包 xwork-core.jar——Command模式框架,WebWork和St ...
- Educational Codeforces Round 8 B. New Skateboard 暴力
B. New Skateboard 题目连接: http://www.codeforces.com/contest/628/problem/A Description Max wants to buy ...
- CentOS 6.9下KVM虚拟机快照创建、删除、恢复(转)
使用文件快照的方式实现文件备份,但单说快照(snapshot)的话,他是某一时间点(版本)你能看到的该时间点备份文件状态的全貌,通过文件的快照(全貌)你能恢复到特定时间点(版本)的文件状态. 创建虚拟 ...
- <摘录>perl正则表达式中的元字符、转义字符、量词及匹配方式
Linux平台上被广泛使用的正则表达式库PCRE - Perl-compatible regular expressions,从其名字即可知道,PCRE提供的是一套与Perl中相兼容的正则表达式. 元 ...
- jstack_查看当前进程及所属线程执行情况
C:\Program Files\Java\jdk1.7.0_45\bin\jstack.exe 1.任务管理器:进程选择PID 2.命令行执行 cd C:\Program Fi ...
- Android内存优化11 内存泄漏常见情况2 内部类泄漏
线程持久化 Java中的Thread有一个特点就是她们都是直接被GC Root所引用,也就是说Dalvik虚拟机对所有被激活状态的线程都是持有强引用,导致GC永远都无法回收掉这些线程对象,除非线程被手 ...
- 使用Facebook的create-react-app脚手架快速构建React开发环境(ant.design,redux......)
编程领域中的“脚手架(Scaffolding)”指的是能够快速搭建项目“骨架”的一类工具.例如大多数的React项目都有src,public,webpack配置文件等等,而src目录中又包含compo ...