Android Ap 开发 设计模式第三篇:模板方法模式

it2022-05-09  26

  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  把补丁安装集成即可。

 

 

源码下载:

 模板方法模式

转载于:https://www.cnblogs.com/TerryBlog/archive/2011/07/08/2101479.html

相关资源:数据结构—成绩单生成器

最新回复(0)