模板方法模式是结构最简单的行为型设计模式,在其结构中只存在父类与子类之间的继承关系。通过使用模板方法模式,可以将一些复杂流程的实现步骤封装在一系列基本方法中,在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法的执行次序,而通过其子类来覆盖某些步骤,从而使得相同的算法框架可以有不同的执行结果。模板方法模式提供了一个模板方法来定义算法框架,而某些具体步骤的实现可以在其子类中完成。
抽象方法规定方法的执行顺序
public abstract class BaseSetupActivity extends Activity { // 1.定义一个手势识别器 private GestureDetector detector; protected SharedPreferences sp; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sp=getSharedPreferences("config", MODE_PRIVATE); // 为手势识别器设置监听事件 detector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener(){ // 当时手指在屏幕上滑动时调用的方法 @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if(Math.abs( velocityX)<200){ return true; } if(Math.abs((e2.getRawY()-e1.getRawY()))>300){ return true; } if((e2.getRawX()-e1.getRawX())>200){ // 从左到右花东,打开上一个页面 showPre(); return true; } if((e1.getRawX()-e2.getRawX())>200){ // 从右到左花东,打开下一个页面 showNext(); return true; } return super.onFling(e1, e2, velocityX, velocityY); } }); } // 基本方法--抽象方法 public abstract void showNext(); // 基本方式--抽象方法 public abstract void showPre(); // 下一步的点击事件 public void next(View view){ showNext(); } // 上一步的点击事件 public void pre(View view){ showPre(); } //3,使用手势识别器 @Override public boolean onTouchEvent(MotionEvent event) { detector.onTouchEvent(event); return super.onTouchEvent(event); } }
public class Setup1Activity extends BaseSetupActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_setup1); } @Override public void showNext() { Intent intent=new Intent(Setup1Activity.this,Setup2Activity.class); startActivity(intent); finish(); // 在finish()或startActivity后面执行 执行动画效果 overridePendingTransition(R.anim.tran_in, R.anim.tran_out); } @Override public void showPre() { } }第二个子类
public class Setup2Activity extends BaseSetupActivity { // 自定义的组件 private SettingItemView siv_setup2_sim; // 获取sim卡信息 private TelephonyManager tm; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_setup2); // 得到TelephonyManager对象 tm=(TelephonyManager) getSystemService(TELEPHONY_SERVICE); // 自定义的组件 siv_setup2_sim=(SettingItemView) findViewById(R.id.siv_setup2_sim); String sim=sp.getString("sim", null); if(TextUtils.isEmpty(sim)){ // 没有绑定sim卡 siv_setup2_sim.setChecked(false); }else{ // 绑定了sim卡 siv_setup2_sim.setChecked(true); } // 为自定义组件设置监听事件 siv_setup2_sim.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Editor edit=sp.edit(); if(siv_setup2_sim.isChecked()){ siv_setup2_sim.setChecked(false); String sim=tm.getSimSerialNumber(); edit.putString("sim", sim); }else{ siv_setup2_sim.setChecked(true); // 保存sim卡的序列号 String sim=tm.getSimSerialNumber(); edit.commit(); } edit.commit(); } }); } @Override public void showNext() { // 判断是否绑定了sim卡 String sim=sp.getString("sim", null); if(TextUtils.isEmpty(sim)){ Toast.makeText(this, "sim卡没有绑定", 0).show(); return ; } Intent intent=new Intent(Setup2Activity.this,Setup3Activity.class); startActivity(intent); finish(); overridePendingTransition(R.anim.tran_in, R.anim.tran_out); } @Override public void showPre() { Intent intent=new Intent(Setup2Activity.this,Setup1Activity.class); startActivity(intent); finish(); overridePendingTransition(R.anim.tran_pre_in, R.anim.tran_pre_out); } }在模板方法模式中,由于面向对象的多态性,子类对象在运行时将覆盖父类对象,子类中定义的方法也将覆盖父类中定义的方法,因此程序在运行时,具体子类的基本方法将覆盖父类中定义的基本方法 实现子类对父类行为的反向控制。