模版方法模式

来源:互联网 发布:刷生死狙击金币软件 编辑:程序博客网 时间:2024/05/07 16:04

 模板方法模式是结构最简单的行为型设计模式,在其结构中只存在父类与子类之间的继承关系。通过使用模板方法模式,可以将一些复杂流程的实现步骤封装在一系列基本方法中,在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法的执行次序,而通过其子类来覆盖某些步骤,从而使得相同的算法框架可以有不同的执行结果。模板方法模式提供了一个模板方法来定义算法框架,而某些具体步骤的实现可以在其子类中完成。

抽象方法规定方法的执行顺序

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(){//       当时手指在屏幕上滑动时调用的方法@Overridepublic 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;@Overrideprotected 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() {@Overridepublic 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();}});}@Overridepublic 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);}@Overridepublic void showPre() {Intent intent=new Intent(Setup2Activity.this,Setup1Activity.class);startActivity(intent);finish();overridePendingTransition(R.anim.tran_pre_in, R.anim.tran_pre_out);}}
  在模板方法模式中,由于面向对象的多态性,子类对象在运行时将覆盖父类对象,子类中定义的方法也将覆盖父类中定义的方法,因此程序在运行时,具体子类的基本方法将覆盖父类中定义的基本方法 实现子类对父类行为的反向控制。


0 0
原创粉丝点击