Android设计模式之:模板模式

2019-12-25  本文已影响0人  小迷糊_dcee

模板模式的定义

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

模板方法模式的使用场景

1.有多个子类共有的方法,且逻辑相同。
2.重要的、复杂的方法,可以考虑作为模板方法。

优点

1、封装不变部分,扩展可变部分。
2、提取公共代码,便于维护。
3、行为由父类控制,子类实现。

缺点

每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

代码的简单实现

public abstract class DinnerComputer {

        public final void flowDinner(){
            whatEat();//想吃什么
            buyFood();//买食材
            cooking();//烹饪
            eat();//吃饭
            washDishes();//清洗餐具
        }
        protected abstract void whatEat();

        protected abstract void buyFood();

        protected abstract void cooking();

        protected abstract void eat();

        protected abstract void washDishes();
    }

尝试做一道西红柿炒蛋

public class TomatoAndEgg extends DinnerComputer {

    @Override
    protected void whatEat() {
        Log.d("ysl","想吃西红柿炒蛋");
    }

    @Override
    protected void buyFood() {
        Log.d("ysl","去菜市场买西红柿和鸡蛋");
    }

    @Override
    protected void cooking() {
        Log.d("ysl","先炒鸡蛋,另起锅再炒西红柿,然后把鸡蛋倒入西红柿中翻炒");
    }

    @Override
    protected void eat() {
        Log.d("ysl","看着电视开吃");
    }

    @Override
    protected void washDishes() {
        Log.d("ysl","洗盘子");
    }
}

实际应用

在android中经常有一些常用的基类,例如BaseActivity或者BaseFragment等,可以运用模板模式

public abstract class BaseActivity extends AppCompatActivity {

    private boolean isHaveTitle = true;//是否有标题栏
    private boolean isHaveStateBar = true;//是否有状态栏
    public Context context;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = this;
        ActivityCollector.getInstance().addActivity(this);
        if (isHaveStateBar) {
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        }
        if (!isHaveTitle) {
            requestWindowFeature(Window.FEATURE_NO_TITLE);
        }

        setContentView(initLayout());
        initView();
        initData();
    }

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

    /**
     * 初始化view组件
     */
    protected abstract void initView();

    /**
     * 设置布局文件
     *
     * @return 布局文件的id
     */
    protected abstract int initLayout();


    /**
     * 隐藏软键盘
     */
    public void hideSoftInput() {
        InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
        if (getCurrentFocus() != null && null != imm) {
            imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        }
    }

    /**
     * 显示软键盘
     */
    public void showSoftInput() {
        InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
        if (getCurrentFocus() != null && null != imm) {
            imm.showSoftInputFromInputMethod(getCurrentFocus().getWindowToken(), 0);
        }
    }

    /**
     * 设置是否显示标题栏
     */
    public void setHaveTitle(boolean isShow) {
        this.isHaveStateBar = isShow;
    }

    /**
     * 是否显示状态栏
     */
    public void setHaveStateBar(boolean isShow) {
        this.isHaveStateBar = isShow;
    }

    /**
     * 显示提示语     
     * @param toastText 文本
     */
    public void showToast(String toastText) {
        Toast.makeText(this, toastText, Toast.LENGTH_SHORT).show();
    }
    /**
     * 判断是否缺少权限
     */
    private boolean lacksPermission(String permission) {
        return ContextCompat.checkSelfPermission(this, permission) ==
                PackageManager.PERMISSION_DENIED;
    }

    /**
     * 动态授权
     * @param permission
     * @return
     */
    public boolean permission(String permission) {
        if (lacksPermission(permission)) {//读写权限开启
            if (Build.VERSION.SDK_INT >= 23) {
                String[] mPermissionList = new String[]{
                        permission,
                };
                ActivityCompat.requestPermissions(this, mPermissionList, 123);
            }
            return false;
        } else {
            return true;
        }
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        ActivityCollector.getInstance().finishActivity();
    }
}

activity的工具类

public class ActivityCollector {
    private static Stack<Activity> activityStack;
    private static ActivityCollector instance;
    private ActivityCollector(){}

    /**
     * 单一实例
     */
    public static ActivityCollector getInstance(){
        if(instance==null){
            synchronized (ActivityCollector.class){
                instance=new ActivityCollector();
            }
        }
        return instance;
    }

    /**
     * 添加Activity到堆栈
     */
    public void addActivity(Activity activity){
        if(activityStack==null){
            activityStack=new Stack<Activity>();
        }
        activityStack.add(activity);
    }
    /**
     * 获取当前Activity(堆栈中最后一个压入的)
     */
    public Activity currentActivity(){
        if(activityStack.isEmpty()){
            return null;
        }else{
            return activityStack.lastElement();
        }
    }
    /**
     * 结束当前Activity(堆栈中最后一个压入的)
     */
    public void finishActivity(){
        Activity activity=activityStack.lastElement();
        if(activity!=null){
            activity.finish();
            activity=null;
        }
    }
    /**
     * 结束指定的Activity
     */
    public void finishActivity(Activity activity){
        if(activity!=null){
            activityStack.remove(activity);
            activity.finish();
            activity=null;
        }
    }
    /**
     * 结束指定类名的Activity
     */
    public void finishActivity(Class<?> cls){
        for (Activity activity : activityStack) {
            if(activity.getClass().equals(cls) ){
                finishActivity(activity);
            }
        }
    }
    /**
     * 结束所有Activity
     */
    public void finishAllActivity(){
        for (int i = 0, size = activityStack.size(); i < size; i++){
            if (null != activityStack.get(i)){
                activityStack.get(i).finish();
            }
        }
        activityStack.clear();
    }

}

写个测试类继承BaseActivty

public class TestActivity extends BaseActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        //状态栏和导航栏的显示,写在super之前
        setHaveStateBar(true);
        setHaveTitle(true);
        super.onCreate(savedInstanceState);

    }

    @Override
    protected void initData() {
        showToast("初始化数据");
    }

    @Override
    protected void initView() {

    }

    @Override
    protected int initLayout() {
        return 0;
    }
}
上一篇下一篇

猜你喜欢

热点阅读