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中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简 ...
随机推荐
- 如何使用weinre来进行远程调试phonegap应用
使用phonegap开发的应用在真机上和PC上的显示效果以及浏览器渲染方式还是有些区别的.在PC端很好调试,各种浏览器都自带了调试工具,使用起来很方便,但是在一旦安装到了手机上,这个时候要进行调试就需 ...
- javascrip 求最大公因数(分解质数法)发生的问题
//这是求一个数的质因数,例如:12=2*2*3 其中2,3都是质数.function primeArray(n, array) { array = new Array(); for (var i = ...
- [BZOJ2159]Crash的文明世界(斯特林数+树形DP)
题意:给定一棵树,求$S(i)=\sum_{j=1}^{n}dist(i,j)^k$.题解:根据斯特林数反演得到:$n^m=\sum_{i=0}^{n}C(n,i)\times i!\times S( ...
- CodeForces - 965D Single-use Stones
题面在这里! 如果你强行把问题建模,可以发现这是一个裸的增广路,又因为这是区间连边,所以跑一个 点数O(N)边数O(N log N)的线段树优化建边的网络流即可,不知道能不能过23333 但其实这个问 ...
- [Codeforces-div.1 809C] Find a car
[Codeforces-div.1 809C] Find a car 试题分析 莫名结论:\(a_{i,j}=(i-1) xor (j-1) +1\) 然后分成\(i\space xor\space ...
- 【后缀自动机】hdu6194 string string string
题意:给你一个字符串和一个正整数K,让你输出恰好出现K次的子串的数量. 对后缀链接树进行dp预处理后,SAM每个点的endpos大小就是该点结尾的子串出现的次数,maxlen-minlen+1就是子串 ...
- 【DFS】【拓扑排序】【动态规划】Gym - 100642A - Babs' Box Boutique
给你10个箱子,有长宽高,每个箱子你可以决定哪个面朝上摆.把它们摞在一起,边必须平行,上面的不能突出来,问你最多摆几个箱子. 3^10枚举箱子用哪个面.然后按长为第一关键字,宽为第二关键字,从大到小排 ...
- 【Splay】bzoj3223 Tyvj 1729 文艺平衡树
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #i ...
- http请求 url 传递参数(特殊字符)解决方法
有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了.下表中列出了一些URL特殊符号及编码 十六进制值 1. + URL 中+号表示空格 %2B ...
- this和$(this)的关系
环境关键字this引用的是DOM元素 $(this)是jQuery对象 下面点击按钮分别alert一下 alert(this); alert($(this)); 获取DOM对象的属性id,可以 $(t ...