到国美面试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设计模式(八)--模板方法模式的更多相关文章

  1. Android设计模式系列--模板方法模式

    模板方法,和单例模式是我认为GOF的23中最简单的两种模式.但是我个人对模板方法的经典思想特别推崇,虽然模板方法在大对数情况下并不被推荐使用,但是这种通过父类调用子类的方法,使用继承来改变算法的一部分 ...

  2. 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)

    原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...

  3. 折腾Java设计模式之模板方法模式

    博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...

  4. Android 设计模式之MVC模式

    说到Android设计模式的MVC模式,估计很多人都是比较熟悉了,这里深入了解一下MVC到底是怎么回事,以ListView为例子讲解. 一.深入理解MVC概念 MVC即Model-View-Contr ...

  5. js设计模式——6.模板方法模式与职责链模式

    js设计模式——6.模板方法模式与职责链模式 职责链模式

  6. 《Android源码设计模式》--模板方法模式

    No1: 模板方法模式包括:抽象类(其中定义了一系列顺序方法).具体实现类A.具体实现类B 如果子类有实现不一样的细节,重写父类的某个方法即可 No2: AsyncTask对象调用execute方法后 ...

  7. 从西天取经的九九八十一难来看Java设计模式:模板方法模式

    目录 示例 模板方法模式 定义 意图 主要解决问题 适用场景 优缺点 西天取经的九九八十一难 示例 当我们设计一个类时,我们能明确它对外提供的某个方法的内部执行步骤, 但一些步骤,不同的子类有不同的行 ...

  8. Android设计模式之命令模式、策略模式、模板方法模式

    命令模式是其它很多行为型模式的基础模式.策略模式是命令模式的一个特例,而策略模式又和模板方法模式都是算法替换的实现,只不过替换的方式不同.下面来谈谈这三个模式. 命令模式 将一个请求封装为一个对象,从 ...

  9. java设计模式之模板方法模式

    模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差 ...

  10. C#设计模式(14)——模板方法模式(Template Method)

    一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简 ...

随机推荐

  1. 29、Flask实战第29天:cms用户名渲染和注销功能实现

    这节来完成用户名渲染和注销的功能,目前用户名在前端页面是写死的,我们需要动态的展示出来 用户名渲染 实现用户名动态展示,其中一种方法就是在视图函数,根据session信息,获取到user id,通过该 ...

  2. 关于windows环境下cordova命令行无法启动adb.exe的解决办法

    使用phonegap开发手机APP,常常需要更改代码之后进行调试,使用安卓模拟器每次启动非常缓慢,而且不能保证最终在真机上的效果.所以一般都采用真机进行调试. 搭建真机的调试环境这里就不再赘述了,网上 ...

  3. Python标准库:内置函数divmod(a, b)

    本函数是实现a除以b,然后返回商与余数的元组. 如果两个参数a,b都是整数,那么会采用整数除法,结果相当于(a//b, a % b).如果a或b是浮点数,相当于(math.floor(a/b), a% ...

  4. WSDL格式浅析

    其中,WSDL是一种 XML 格式,用于将网络服务描述为一组端点,这些端点对包含面向文档信息或面向过程信息的消息进行操作.这种格式首先对操作和消息进行抽象描述,然后将其绑定到具体的网络协议和消息格式上 ...

  5. 【UOJ #34】多项式乘法

    http://uoj.ac/problem/34 看了好长时间的FFT和NTT啊qwq在原根那块磨蹭了好久_(:з」∠)_ 首先设答案多项式的长度拓展到2的幂次后为n,我们只要求出一个g(不是原根)满 ...

  6. [BZOJ4000][TJOI2015]棋盘(状压DP+矩阵快速幂)

    题意极其有毒,注意给的行列都是从0开始的. 状压DP,f[i][S]表示第i行状态为S的方案数,枚举上一行的状态转移.$O(n2^{2m})$ 使用矩阵加速,先构造矩阵a[S1][S2]表示上一行为S ...

  7. 【拓扑排序】Genealogical tree

    [POJ2367]Genealogical tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5696   Accep ...

  8. ssm框架整合快速入门

    写在前面: 公司一直都是使用ssh框架(Struts2,Spring,Hibernate)来开发,但是现在外面的公司大多数都是使用的ssm框架,所以也有必要多学习一下外面的新技术.这里就快速搭建一个小 ...

  9. iOS 日志管理异常捕获组件LFLogManager

    一.功能 1.分级打印保存 解决一大堆重要.不重要打印信息在控制台混为一团的尴尬局面.可设置仅打印某级别及以上的信息.分为5类打印: DDLogError(@"打印并保存特别重要信息&quo ...

  10. Android进阶笔记:Messenger源码详解

    Messenger可以理解为一个是用于发送消息的一个类用法也很多,这里主要分析一下再跨进程的情况下Messenger的实现流程与源码分析.相信结合前面两篇关于aidl解析文章能够更好的对aidl有一个 ...