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中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简 ...
 
随机推荐
- PM过程的一些典型场景和问题
			
如何进行团队激励 如何进行目标管理 如何进行绩效考核 如何处理团队沟通(技巧) 详述几种软件过程理论 需求分析和度量 测试过程和工具 开发管理过程
 - <四边形不等式优化>[NOI1995]石子合并
			
留个坑 挺套路的 明天来写个总结 #include<cstdio> #include<algorithm> inline int read() { int x = 0,f = ...
 - 【线性基】hdu3949 XOR
			
给你n个数,问你将它们取任意多个异或起来以后,所能得到的第K小值? 求出线性基来以后,化成简化线性基,然后把K二进制拆分,第i位是1就取上第i小的简化线性基即可.注意:倘若原本的n个数两两线性无关,也 ...
 - 【线段树】HDU1394 - Minimum Inversion Number
			
[题目大意] 给出0..n-1组成的一段数,可以移动前几个数到结尾.求出最小的逆序对个数. [思路] 先用线段树求出逆序对,方法和树状数组是一样的.然后对于当前第一个数num[0],在它之后比它小的数 ...
 - Objective-c nil, Nil, NULL和NSNull的区别
			
在OC中可能经常会遇到 nil,Nil,NULL和NSNull,下面分析一下之间的区别: Symbol Value Meaning NULL (void *)0 literal null value ...
 - RMI(Remote Method Invocation ) 概念恢复
			
1.RMI是远程方法调用的简称,像其名称暗示的那样,它能够帮助我们查找并执行远程对象,通俗的说,远程调用就像一个class放在A机器上,然后在B机器中调用这个class的方法. 2.EMI术语 在研究 ...
 - C#中的Stack
			
Stack(栈) 是一种先进后出的对象集合,它是一个泛型,所表示的类型可以为int,string这样的常见类型,也可以为用户自定义类型. 属性 描述 Count 获取 Stack 中包含的元素个数. ...
 - Word中设置三栏式表格
			
一般期刊要求三栏式表格,我原来是选中表格,用橡皮差擦去不必要的线,但是今天发现只能查去横线,竖线一插曲格式就乱了,我想起了上图,不选“内部竖框线”就好了.
 - vagrant public_network 自定义静态 ip配置方法
			
Vagrant 创建虚拟化开发环境 Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境.它 使用Oracle的开源VirtualBox虚拟化系统,使用 Chef创建自动化虚拟环境. ...
 - JSON Bean 相互转换工具(效率是Gson的两倍以上)
			
本帖最后由 xuehuayous 于 2015-12-24 08:44 编辑 前几天想封装一个自定义控件,用到Json解析,以前都使用Gson来解析Json数据的,但是想到一个简单的自定义控件就没必要 ...