模板设计模式

1. 定义


定义一个操作中的算法的框架,而将一些步骤延迟到子类。使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。

其实就是系统、或者其他人已经把所有东西都写好,把架子都搭好,里边有的东西你自己可以根据自己的业务需求去实现就行,效果分析图如下:


模板设计模式.png

2. 基本框架


角色的介绍:
AbstractClass:抽象类,定义了一套算法框架;
ConcreteClass:具体的实现类,可以自定义一些算法;

3. BaseActiivty的构建


/**
 * Email: [email protected]
 * Created by JackChen 2018/3/31 21:43
 * Version 1.0
 * Params:
 * Description:  整个应用的 BaseActivity
*/
public abstract class BaseActivity extends AppCompatActivity {

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 设置布局 layout
        setContentView();

        // 一些特定的算法,子类基本都会使用的
        ViewUtils.inject(this);

        // 设置标题
        initTitle() ;

        // 初始化界面
        initView() ;

        // 初始化数据
        initData() ;

    }

    // 设置布局 layout
    protected abstract void setContentView();

    // 设置标题
    protected abstract void initTitle();

    // 初始化界面
    protected abstract void initView();

    // 初始化数据
    protected abstract void initData();


    /**
     * 启动Activity
     */
    protected void startActivity(Class clazz){
        Intent intent = new Intent(this , clazz) ;
        startActivity(intent);
    }

}

BaseSkinActivity代码如下:

/**
 * Email: [email protected]
 * Created by JackChen 2018/4/1 8:52
 * Version 1.0
 * Params:
 * Description:  不要直接继承BaseActivity,永远都要给中间留一层BaseSkinActivity
*/
public abstract class BaseSkinActivity extends BaseActivity {
    // 这里预留出地方 防止后期会有什么新的功能添加
}

SecondActivity直接继承BaseSkinActivity,而不是继承BaseActivity

/**
 * Email: [email protected]
 * Created by JackChen 2018/3/31 21:57
 * Version 1.0
 * Params:
 * Description:
*/
public class SecondActivity extends BaseSkinActivity{


    @ViewById(R.id.test_tv)
    TextView test_tv ;
    @ViewById(R.id.test_iv)
    ImageView test_iv ;


    /**
     * 设置布局文件
     */
    @Override
    protected void setContentView() {
        setContentView(R.layout.activity_second);
    }


    /**
     * 初始化头部
     */
    @Override
    protected void initTitle() {

    }


    /**
     * findViewById
     */
    @Override
    protected void initView() {
        startActivity(SecondActivity.class);
    }


    /**
     * 请求网络的数据
     */
    @Override
    protected void initData() {

    }
}

只可以把一些通用的代码封装到 BaseActivity,如果用的不是特别多的,就不要放到里边

注意:

1>:BaseActivity中只能放一些通用的方法,基本是每个Activity都需要使用的方法,比如读数据readDataBase最好不要放进来;
2>:如果是两个或者两个以上的地方要使用,最好写一个工具类;
3>:因为每个子类Activity都会继承BaseActivity,所以只要一继承BaseActivity,那么这个子类就会加载进内存,那么该子类中的方法也就会加载进内存,其实内存在davilk层就是一块内存地址,也就是时候如果你在BaseActivity中写了很多的方法,而且有的方法又不太常用,所以就会占用很多的内存地址,那么肯定是会影响性能的;
4>:为了防止后期会有一些新的功能添加,所以永远都要预留一层BaseSkinActivity,不要直接去继承BaseActivity,而是要让自己的类去继承BaseSkinActivity;

4. 常见使用模板设计模式的有:


AsyncTask、View的绘制流程(View中的draw()方法)、BaseActivity、Activity的生命周期

5. 设计模式开源的网站:

https://github.com/simple-android-framework-exchange/android_design_patterns_analysis#schedule

你可能感兴趣的:(模板设计模式)