到国美面试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. WebDAV服务漏洞利用工具DAVTest

    WebDAV服务漏洞利用工具DAVTest   WebDAV是基于Web服务的扩展服务.它允许用户像操作本地文件一样,操作服务器上的文件.借助该功能,用户很方便的在网络上存储自己的文件.为了方便用户使 ...

  2. 【BZOJ 1901】【ZJU 2112】Dynamic Rankings

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 重新用整体二分写了一下. 整体二分的思想详见论文. 貌似带修区间k大和静态区间k大都是\(O( ...

  3. JZYZOJ1383 [usaco2003feb]impster 位运算 最短路

    http://172.20.6.3/Problem_Show.asp?id=1383  找能到达某个状态的最小操作数,然后把所有状态扫一遍即可,要额外判定一下起始就有的状态(如果起始里没有0那么这些状 ...

  4. 【构造】【分类讨论】Codeforces Round #435 (Div. 2) C. Mahmoud and Ehab and the xor

    题意:给你n,x,均不超过10^5,让你构造一个无重复元素的n个元素的非负整数集合(每个元素不超过10^6),使得它们的Xor和恰好为x. 如果x不为0: 随便在x里面找一个非零位,然后固定该位为0, ...

  5. 【找规律】【递推】【二项式定理】Codeforces Round #419 (Div. 1) B. Karen and Test

    打个表出来看看,其实很明显. 推荐打这俩组 11 1 10 100 1000 10000 100000 1000000 10000000 100000000 1000000000 1000000000 ...

  6. 求n以内的质数的数量

  7. 操作系统--IO系统任务简述

    内核IO---操作系统对于IO的职责 1.对文件和设备命名空间的管理 2.文件和设备访问的控制 3.IO操作控制 4.文件系统的空间分配 5.设备分配 6.IO缓冲管理 7.IO调度方式 8.设备状态 ...

  8. 支持向量机(SVM)介绍

    一.了解支持向量机   支持向量机(support vector machings, SVM) 是一种二分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化 ...

  9. python3 str和bytes之间转换

    a bytes-like object is required, not 'str' 碰到 这个错误 ,是因为需要是的bytes,不是str bytes -> str: 1  str-> ...

  10. Bootstrap导航栏实例讲解

    导航栏是一个很好的功能,是 Bootstrap 网站的一个突出特点.导航栏是响应式元组件就,作为应用程序或网站的导航标题.导航栏在移动设备的视图中是折叠的,随着可用视口宽度的增加,导航栏也会水平展开. ...