我的Android设计模式(一) 层级控制模式

6 篇文章 0 订阅
6 篇文章 0 订阅

我的Android设计模式(一) 层级控制模式

写在前面:最近突然迷上了设计模式,在对Java设计模式的研究中,结合最近正在做的Android工程和面向对象设计思想,我领悟到了一些对于Android代码维护和设计比较有用的一些设计模式,在今后的这段日子里,我就不断的把这些设计模式分享出来,希望可以得到大家的指正,或者给大家一些帮助。

今天给大家带来的是我自称为“层级控制”的设计模式,很简单的一种设计模式,类似于公司中的管理机制,是我在对Android SQLite 数据库进行操作时领悟的,也可应用于其他类似需求的地方,下面我就以我在我的项目中对数据库的操作为例给大家分享这个设计模式。

设计图示

设计图示

这样的结构设计使数据库创建,数据库内容操作,数据表内容操作分解开来,每个类各司其职,做到了最大程度的解耦合,并且在内部将数据库连接做一定处理,减少了频繁数据库连接断开操作,做到了一定的优化。

代码样例

BaseSQLiteHelper 类

这个类继承自SQLiteOpenHelper类,主要用于数据库,数据库表的创建和数据库版本的控制,像一个公司的Boss,只做一些决定公司命运的决策。

public abstract class BaseSQLiteHelper extends SQLiteOpenHelper {

    private final static String CREATE_USER_TABLE = "create table user(...)";

    public BaseSQLiteHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_USER_TABLE ); //创建User表
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }

}
SQLiteHelper 类

这个类继承自BaseSQLiteHelper ,主要做一些对数据库级的造作,比如删除数据库表,清空数据库,获得数据库连接,关闭数据库连接之类的操作,像一个公司Boss的助理,帮助Boss管理下层。在这个类里面我还将数据库的连接做了优化,有效的减少了数据库频发的连接与关闭和多线程下数据库操作的耗时耗资源操作。

public class SQLiteHelper extends BaseSQLiteHelper {

    //还记的BaseSQLiteHelper中创建的User表吗?他的表名被放置在这里,用于子类调用和本类操作
    protected final static String TABLE_NAME_USER = "user";
    //创建一个volatile修饰的静态数据库长连接
    private volatile static SQLiteDatabase database = null;
    private String[] tablesName = new String[]{
            TABLE_NAME_USER ,
    };

    /**
     * 传入程序总的ApplicationContext, 防止被销毁
     */
    public SQLiteHelper(Context context) {
        super(context.getApplicationContext());
    }

    /**
     * 使用单例模式防止数据库频繁创建连接
     * 每次获取连接时通过这个方法
     */
    protected SQLiteDatabase getDatabase() {
        if (database == null) {
            synchronized (this) {
                if (database == null) {
                    database = getReadableDatabase();
                }
            }
        }
        return database;
    }

    /**
     * 防止重复关闭数据库
     */
    public synchronized void closeDatabase() {
        if (database != null) {
            database.close();
            database = null;
        }
    }

    /**
    * 用于清空数据库表,采用事务,防止耗时
    */
    public void clearTableDatas() {
        new Thread() {
            @Override
            public void run() {
                getDatabase().beginTransaction(); //开启事务
                try {
                    for (int i = 0; i < tablesName.length; i++) {
                        database.delete(tablesName[i], "", new String[]{});
                    }
                    getDatabase().setTransactionSuccessful(); //设置事务成功
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    getDatabase().endTransaction(); //结束事务
                }
                closeDatabase();
            }
        }.start();
    }

}
UserTableHelper类

这个类继承自SQLiteHelper,主要用于数据库的增删改查,可以有多个“×××TableHepler”类去管理对应的“×××数据库”。,它想当于一个公司的员工,各司其职,去管理每个人对应的小方向。

还有一个小技巧,每次向数据库表进行操作时都会对其中的字段表示傻傻记不清楚,所以我做了一个ValueHolder类,对其中每行数据的字段进行保存,方便我们操作。

public class UserTableRowHolder implements Serializable {
        public String id = "";
        public String username = "";
        public String gender = "";
        public String nickname = "";
        public String avatar = "";
        public String isFriend = "";
}
/**
* 使用User表当做事例,其他的表也有一样的结构
*/
public class UserTableHelper extends SQLiteHelper {

    public UserTableHelper(Context context) {
        super(context);
    }

    public void removeUser(final String username) {
        new Thread() {
            @Override
            public void run() {
                //获取父类中只做的数据库长连接
                getDatabase().delete(TABLE_NAME_USER, "username=?", new String[]{username});
            }
        }.start();
    }

    public void addOneRow(final UserTableRowHolder holder) {
        new Thread() {
            @Override
            public void run() {
                Object[] values = new Object[]{
                        holder.username,
                        holder.gender,
                        holder.nickname,
                        holder.avatar,
                        holder.isFriend
                };
                //获取父类中的数据库长连接
                getDatabase().execSQL("insert into " + TABLE_WDGZ_FRIEND + " values(null,?,?,?,?,?)", values);
                super.run();
            }
        }.start();
    }

    public List<WDGZFriendTableRowHolder> getDatas() {
        //获取父类只做的数据库长连接
        Cursor cursor = getDatabase().rawQuery("select * from " + TABLE_NAME_USER, new String[]{});
        ArrayList<UserTableRowHolder> result = new ArrayList<>();
        // 遍历Cursor结果集
        while (cursor.moveToNext()) {
            UserTableRowHolder holder = new UserTableRowHolder();
            holder.id = cursor.getString(0);
            holder.username = cursor.getString(1);
            holder.gender = cursor.getString(2);
            holder.nickname = cursor.getString(3);
            holder.avatar = cursor.getString(4);
            holder.isFriend = cursor.getString(5);
            result.add(holder);
        }
        cursor.close();
        return result;
    }

}

总结

这就是我设计“层级控制”模式,这种控制模式使每一层之间和每一层内的元素之间虽然保存着必要的联系,但是他们之间已经大幅度的解耦合,如果想要再对一些地方的代码进行修改,比如说数据库字段更改,增加数据库,也很难会影响其他的数据库,而且这种设计模式使得数据库使用变的更加的方便快捷。
这就是我对这个模式的运用和理解,个人觉的对我目前所做的工程带来了极大的帮助,希望也可以帮助大家,希望大家对我指正,帮助我走的更远。以后我还会经常把最近研究出的非常好的适合Android的设计模式分享出来,希望大家继续关注我~一个有理想的Coder~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值