代码改变世界

View编程(4): Template method

2011-12-14 16:02  tang768168  阅读(169)  评论(0编辑  收藏  举报

说重点之前,给大家推荐一篇文章,算是对View绘图的一个小例子。

  1. public class AndroidTest extends Activity {  
  2.       
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.    
  7.         MyView mv = new MyView(this);  
  8.         setContentView(mv);  
  9.     }  
  10.    
  11.     public class MyView extends View {  
  12.    
  13.         MyView(Context context) {  
  14.                 super(context);  
  15.         }  
  16.    
  17.                 @Override  
  18.                 protected void onDraw(Canvas canvas) {  
  19.                         // TODO Auto-generated method stub  
  20.                         super.onDraw(canvas);  
  21.    
  22.                         // 首先定义一个paint   
  23.                         Paint paint = new Paint();   
  24.    
  25.                         // 绘制矩形区域-实心矩形   
  26.                         // 设置颜色   
  27.                         paint.setColor(Color.BLUE);   
  28.                         // 设置样式-填充   
  29.                         paint.setStyle(Style.FILL);   
  30.                         // 绘制一个矩形   
  31.                         canvas.drawRect(new Rect(00, getWidth(), getHeight()), paint);   
  32.    
  33.                         // 绘空心矩形   
  34.                         // 设置颜色   
  35.                         paint.setColor(Color.RED);   
  36.                         // 设置样式-空心矩形   
  37.                         paint.setStyle(Style.STROKE);   
  38.                         // 绘制一个矩形   
  39.                         canvas.drawRect(new Rect(101010030), paint);   
  40.    
  41.                         // 绘文字   
  42.                         // 设置颜色   
  43.                         paint.setColor(Color.GREEN);   
  44.                         // 绘文字   
  45.                         canvas.drawText("Hello"1050, paint);   
  46.    
  47.                         // 绘图   
  48.                         // 从资源文件中生成位图   
  49.                         Bitmap bitmap = BitmapFactory.decodeResource(getResources(),   
  50.   
  51.                             R.drawable.icon);   
  52.                         // 绘图   
  53.                         canvas.drawBitmap(bitmap, 1060, paint);   
  54.                 }  
  55.    
  56.     }  
  57. }  

来自:http://blog.sina.com.cn/s/blog_60d33d360100qlb8.html

Android系统是一个优秀的应用程序框架,在框架中设计模式有着广泛的应用。当然Android也不会例外,本文只是简单以View类为例来说明Template method模式在Android中的应用。

首先我们温习一下Template method模式。模板方法模式作用是:在基类中定义好算法和流程。具体的实现延迟到派生类中定义。其UML图如下:

从上图我们可以看出在AbstractClass中定义好了TemplateMethod方法,这个方法中定义好了对 PrimitiveOperation方法的调用,但是在AbstractClass中把PrimitiveOperation方法定义成了抽象方法,没 有实现,所以这个方法也只能是一个模板,不能调用。这样当定义ConcreteClass的时候,需要定义PrimitiveOperation方法,这 样AbstractClass中的TemplateMethod方法中定义的逻辑就可以正确运行了。

我通过上面的描述我们可以知道,模板方法这个模式在框架中肯定会有很广泛的应用。这个模式可以对应成逻辑流程在框架中定义,具体实现有用户自己定义。

下面我以Android框架中的View类为例来介绍一下,这个模式在Android中的应用。

1、创建一个helloview工程。

2、增加一个MyView类,代码如下:

  1. package com.simon.helloview;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Paint;  
  6. import android.view.View;  
  7.   
  8. public class MyView extends View {  
  9.     public MyView(Context context) {  
  10.         super(context);  
  11.     }  
  12.   
  13.     protected void onDraw (Canvas canvas) {  
  14.         Paint paint = new Paint();  
  15.         paint.setARGB(25525500);  
  16.         canvas.drawCircle(100100100, paint);  
  17.     }  
  18. }  

3、定义HelloViewActivity代码如下:

  1. package com.simon.helloview;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5.   
  6. public class HelloViewActivity extends Activity {  
  7.     /** Called when the activity is first created. */  
  8.     @Override  
  9.     public void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         setContentView(new MyView(this));  
  12.     }  
  13. }  

这个例子中,MyView实现了基类View的onDraw方法,该方法是protected,不能被用户调用的。那么谁会调用这个方法呢?如果你仔细研究一下View.java的代码,你就会发现在View的draw方法中调用了onDraw方法。逻辑如下:

  1. public void draw(Canvas canvas) {  
  2.     .......  
  3.     onDraw(canvas);  
  4.     .......  
  5. }  

由此可见基类View中已经定义好了模板方法,所以派生类中只需要定义onDraw方法在窗口上面画怎么画就可以了。用户调用view对象的模板方法draw方法来绘制窗口。

在Android模板方法有这个很广泛的应用,基本上随处可见。在比如Activity类的onCreate,onStart等方法,都是在基类定义好了模板方法,而这些方法可以理解成派生类具体实现。当在适当条件下,基类根据自己的逻辑调用基类中的这些方法。

我们在做软件的过程中,要多以设计模式的眼光来研究问题,分析问题,对我们分析问题的能力会有一个比较大的提高。

在Android模板方法有这个很广泛的应用,基本上随处可见。在比如Activity类的onCreate,onStart等方法,都是在基类定义好了模板方法,而这些方法可以理解成派生类具体实现。当在适当条件下,基类根据自己的逻辑调用基类中的这些方法。

我们在做软件的过程中,要多以设计模式的眼光来研究问题,分析问题,对我们分析问题的能力会有一个比较大的提高。

 

原文:http://my.unix-center.net/~Simon_fu/?p=664

 

转载地址:http://blog.csdn.net/androidbluetooth/article/details/6696473