设计模式有很多,一个一个学不太现实,我是走安卓开发的。着重看一看安卓涉及的设计模式。
1.适配器模式adapter。
这个东西我第一次见是别人已经做好了的音乐搜索功能。其中暂时音乐列表需要用到listview。然后已经写好了adapter。
(吐槽一下,我大三上18.9就已经学习了移动应用开发,知道19.7月做了一个音乐播放器,才有了感觉,后面在星网锐捷线下实训有了更加深入的理解)
第一次看见我也只能用别人的东西。
废话少说:
目的:适配,让接口满足新环境等等。
例子:
优点:灵活
代码:
1.接口A(1) 接口B(2 3)
2.实现B的类C(2(!),3) 实现B的类D(2,3(!))
3.实现A的适配器类E E包含(B的对象?) 一个适配器对象用B来指向 C和D 使用(2 3功能)同时使用1功能
4.类X 实现了接口A 内置A 对象把功能1支持j 同时也有 2 3
5.使用:X的实例x x.1() x.2() x.3() x.4() 4不可以用。
上面还是太抽象了。我总结一下:这样做哟什么好处,你要加上4的功能可以 加在接口A 里面然后实现 扩展性好。
安卓怎么用:
public class MyViewAdapter extends BaseAdapter {
private Context mContext;
private ArrayList mList = new ArrayList();

public MyViewAdapter(Context mContext,ArrayList mList) {
    super();
    this.mContext = mContext;
    this.mList = mList;
}

@Override
public int getCount() {

    return mList.size();
}

@Override
public Object getItem(int position) {

    return mList.get(position);
}

@Override
public long getItemId(int position) {

    return position;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder viewHolder;
    final int index=position;
    if (convertView == null) {
        viewHolder = new ViewHolder();
        convertView = LayoutInflater.from(mContext).inflate(
                R.layout.lcd_userlist_item, null);
        viewHolder.t1=convertView.findViewById(R.id.con_username);
        viewHolder.bt1 =  convertView.findViewById(R.id.deleteuser);
        viewHolder.bt2 =  convertView.findViewById(R.id.edituser);

        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }
    // 用bean 来填充数据
    viewHolder.t1.setText(mList.get(index).toString());
    viewHolder.bt1.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {

        System.out.println("删除按钮被点击了位置是"+index);
        DatabaseHelper dbHelper=new DatabaseHelper(mContext,"UserList",null,1);
        SQLiteDatabase db=dbHelper.getWritableDatabase();
        db.execSQL("delete from userlist where username="+mList.get(index).toString());
        db.close();
        viewHolder.bt1.setEnabled(false);
        }
    });
    viewHolder.bt2.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

        System.out.println("编辑按钮被点击了位置是"+index);

        }
    });
    return convertView;
}

final static class ViewHolder {
    TextView t1;
    Button bt1, bt2;
}

上一大坨代码恶心一下。如果是5月份的我可能看不懂,但是现在不一样了。这个适配器用来接收listview 的数据 把他填充到listview里面的itemview里面。这不就是一个适配的过程吗。你的数据有很多,但是可以再listview里面展示出来。

在代码里面就是这样写的

(2).holder
接上面的代码,holder是什么。这段代码其实是我从网上找的,但是用的时候我只知道填代码填数据。为什么要用holder因为功能要求点击按钮删除这个用户。找来找去用holder可以监听每一个item的按钮。后面看了第一行代码以后我才知道holder可以用来缓存对象,提高listview的性能不用每次都去findviewbyid。我可以说是安卓特色吗?恰好holder还可以帮我实现监听功能。

2.命令模式。例子:handler
在实现子线程刷新ui的办法中,安卓给我们提供了handler和message和looper

图片说明
当然还有
这个地方会提示
解决办法:弱引用。这里不想改了。具体操作百度有。多说跑题
还有很多问题,代码非常粗糙 如果有想帮新手修改bug或者优化的 可以去我的牛客网找一找下载代码修改
既然重新回顾一下这个问题,我的解决办法:
我用的是静态公有变量timerstr表示播放时间。
这里会涉及到多线程。如果你切换歌曲的时候,timer没有取消 就会让你的那个时间条跳起来看起来很滑稽。 我在使用timer之前都会取消掉它。
基本上是遇到问题,百度解决问题
回到正文:
这里就是在子线程里面控制播放进度。用这个安卓给我们的命令模式实现刷新ui。比较简单。菜鸟教程写的不错我也搬运一下。https://www.runoob.com/design-pattern/command-pattern.html

命令模式总结:数据驱动!

篇幅有点长,这一篇回顾了结合自己写过的代码  分析安卓用到的适配器模式和命令模式的地方。