Template Method Pattern
模板的含义
所谓模板,有用过VS的朋友会比较熟悉,这个IDE将一些统一的代码编写方法制作成模板加载在IDE里面,开发者可以根据自己制作的模板或者微软提供的模板比如Asp.net 、Winform 、WPF开发等各种模板。而Android 建立项目初期生成的Project 也可以当作是一个模板。它是将原先定义好的东西事先写好了一套规范,具体要如何使用这套规范模板来完成不同的任务,是要看我们的AP开发者不同的实现方法。
作为模板的方法要定义在父类,而方法的定义中使用到抽象方法。因此如果只看父类部分的程序,根本不知道到底会是怎样处理内容,最多只能了解该如何调用处理抽象方法而已。
实际实现抽象方法的是子类。要在子类实现方法,才能决定具体的操作。理论上,如果在不同的子类执行不同的实现,应该就能发展出不同的处理内容 。不过无论在哪个子类执行任何一种实现,处理的大致流程都是还要依照父类的制定方式。
程序示例
此例子定义了三个类一个为抽象类(AbstractDisplay),另外两个为分别实现这个抽象类其中的三个抽象方法,具体的程序示例图见如下:
![]()
程序示意图
AbstractDisplay 抽象类
public
abstract
class
AbstractDisplay {
public
abstract
String open();
public
abstract
String print();
public
abstract
String close();
public
final String display() {
StringBuffer sb
=
new
StringBuffer();
sb.append(open());
for
(
int
i
=
0
; i
<
5
; i
++
) {
sb.append(print());
}
sb.append(close());
return
sb.toString();
}
}
该类只实现了方法display 方法,并抽象出open(),print(),close() 这三个方法交子类代为实现。
CharDisplay 类
public
class
CharDisplay extends AbstractDisplay {
private
char
ch;
public
CharDisplay(
char
ch) {
this
.ch
=
ch;
}
@Override
public
String close() {
//
TODO Auto-generated method stub
return
"
>>
"
;
}
@Override
public
String open() {
//
TODO Auto-generated method stub
return
"
<<
"
;
}
@Override
public
String print() {
//
TODO Auto-generated method stub
return
String.valueOf(ch);
}
}
StringDisplay 类
public
class
StringDisplay extends AbstractDisplay {
public
String
string
;
private
int
width;
public
StringDisplay(String
string
) {
this
.
string
=
string
;
this
.width
=
string
.length() ;
}
@Override
public
String close() {
//
TODO Auto-generated method stub
return
printLine();
}
@Override
public
String open() {
//
TODO Auto-generated method stub
return
printLine();
}
@Override
public
String print() {
//
TODO Auto-generated method stub
return
"
|
"
+
string
+
"
|\n
"
;
}
private
String printLine() {
StringBuffer sb
=
new
StringBuffer();
for
(
int
i
=
0
; i
<
width; i
++
) {
sb.append(
"
*
"
);
}
return
sb.toString()
+
"
\n
"
;
}
}
界面处理代码:
public
class
TemplatePatternActivity extends Activity {
/*
* Called when the activity is first created.
*/
@Override
public
void
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final AbstractDisplay d1
=
new
CharDisplay(
'
H
'
);
final AbstractDisplay d2
=
new
StringDisplay(
"
android pattern
"
);
Button result
=
(Button)findViewById(R.id.btn_result);
final EditText et_result
=
(EditText)findViewById(R.id.result);
result.setOnClickListener(
new
OnClickListener() {
@Override
public
void
onClick(View v) {
//
TODO Auto-generated method stub
et_result.setText(d1.display()
+
"
\n
"
+
d2.display());
}
});
}
}
效果如下:
![]()
在模板方法模式当中,父类跟子类之间的联系互相紧密。因此如果要在子类实现一个己经在父类声明过的抽象方法时,必须先了解应该在哪个时间点调用这个抽象方法。要是没有父类的程序源代码,恐怕子类实现会是一个高难度的挑战。
额外扩展
有朋友建议我把类图的UML画出来,其实很早就有想过要这样做,但懒得重新安装一个软件包,之后在网上找到了ArgoEclipse 用了一下觉得不错,也在本篇文章中将UML图画了出来。
将插件集成在Eclipse IDE中很简单,只需要在利用eclipse 的下载器到这个位置 :http://argoeclipse.tigris.org/update_site 把补丁安装集成即可。
源码下载:
模板方法模式
本文转自 terry_龙 51CTO博客,原文链接:http://blog.51cto.com/terryblog/606786,如需转载请自行联系原作者