Android中常见的设计模式

自己理解的设计模式遵循的原则:

1)功能单一明确,设计一个类的意图要明确,不能大包大揽什么功能都继承进去

2)对于扩展要开放,修改要关闭。软件通常都有需求变化,变化过程中通过扩展的方式来实现需求变化,而不是通过修改原有的方法,因为修改原有的方法会导致原来方法的调用方会出问题,这样层层调用出问题。

3)变化的进行抽象,不变的进行具体。设计代码过程中会面对很对可变的东西,比如在实现一个功能的时候,能够运用不同的方式进行实现,这个时候可以将每个具体的实现方法进行抽象,真正不变的是这个方法要实现的目的

单例模式:

单例模式太多了,在整个应用中只有一个,标准的单例模式写法:

public class singleton{
    private volatitle static instance; //使用volatile 表明每次都会去内存中读取最新的值; static 表明生成周期和当前应用一样

    public singleton(){
    }

    public static singleton getInstance(){  //同样使用静态方法获取
         if(instance == null){
              synchronized (singleton.classs){ //在多线程中获取需要进行同步,或者会导致同步问题
                   if(instance == null)
                         instance = new singleton();
              }
         }
         return instance;
    }
}

 Builder模式

当需要创建一个对象需要很多变量组合而成,这个时候可以考虑将这个对象的创建过程和对象的表示分离开来,这样可以很简洁的构建一个复杂的对象。

常见的builder模式有创建dialog的过程。

AlertDialog.Builer builder=new AlertDialog.Builder(context);
builder.setIcon(R.drawable.icon)
    .setTitle("title")
    .setMessage("message")
    .setPositiveButton("Button1",
        new DialogInterface.OnclickListener(){
            public void onClick(DialogInterface dialog,int whichButton){
                setTitle("click");
            }
        })
    .create()
    .show();

在这种情况下当创建一个dialog时,并不需要分别去为某一个对象单独写一个构造函数,而且创建过程一目了然。

策略方法模式

定义:有一系列的算法,将每个算法封装起来(每个算法可以封装到不同的类中),各个算法之间可以替换,策略模式让算法独立于使用它的客户而独立变化。

比如在注册一个用户信息时,可能最终会注册到不同的服务器上,但是对于上层代码并不关心最终用户数据到哪,只需要有地方存储就可以,所以可以抽象出存储函数,真正的实现让其实现的子类去做。

抽象出注册用户信息函数:

public interface IUserManager {
    /**
     * @Decription 注册
     **/
    void register(final UserDALEx user, final ICallBackObject<UserDALEx> callBack);

    /**
     * @Decription 登陆
     **/
    void login(final Context context, final String name, final String psw, final ICallBackObject<UserDALEx> callBack);

    /**
     * @Decription 根据输入查询用户
     **/
    void queryUsers(String username,int limit,final ICallBackObject<List<UserDALEx>> callBack);
...
}

定义不同的实现方法

public class BmobUserManager implements IUserManager {

    @Override
    public void register(UserDALEx user, final ICallBackObject<UserDALEx> callBack) {
        。。。
    }
 @Override
    public void login(Context context, String name, final String psw, final ICallBackObject<UserDALEx> callBack) {
       ...
    }
 @Override
    public void queryUsers(String username, int limit, final ICallBackObject<List<UserDALEx>> callBack) {
        ....
    }

当然这里还肯定可以用其他对象的方法去实现它。在应用的初始化中过程中设置使用哪一种方法.

//初始化云数据库
        IUserManager userManager = new BmobUserManager();
        Bmob.initialize(this, NCAppContext.ApplicationID);
        CloudManager.getInstance().setUserManager(userManager);
。。。
}

工厂方法模式
我们创建的activity或者fragment中,定义基类的时候,可以将每个界面不同的地方抽象出来,让真正实现的子类去实现该统一的方法。

基类的方法

public interface IBase<P> {
    /**
     * 功能描述:给view绑定数据
     **/
    void onInitView(Bundle savedInstanceState);

    /**
     * 功能描述:获得布局文件Id
     **/
    int getLayoutResource();
}

在不同的实现子类activity或者fragment中去实现该方法

public class LoginActivity implements  IBaseview{

   @Override
    public void onInitView(Bundle savedInstanceState) {
     //....
    }

    @Override
    public int getLayoutResource() {
        return R.layout.activity_login;
    }

}

观察者模式

在安卓中观察者模式用的比较多的地方在数据库变化或者listview内容有变化时,使用notifyDataSetChanged()方法。

public ContactListAdapter netAdapter;
mNetDataList.addAll(mList);
netAdapter.notifyDataSetChanged();
notifyDataSetChanged()该函数的定义在adapter中
public final void notifyDataSetChanged() {
       mObservable.notifyChanged();
}

通知所有被观察者去更新。

组合模式

这种模式在安卓中最常见,Android中的view是一种树形结构,每个viewGroup包含一些列的view,而每个viewGroup本身又可以当做一个view,所以最终手机上呈现出来的界面,是由一个个view组合而成的。

适配模式

其实适配器模式很容易理解,我们在Android开发时也经常用到。比较典型的有ListView和RecyclerView。为什么ListView需要使用适配器呢?主要是,ListView只关心它的每个ItemView,而不关心这个ItemView具体显示的是什么。而我们的数据源存放的是要显示的内容,它保存了每一个ItemView要显示的内容。ListView和数据源之间没有任何关系,这时候,需要通过适配器,适配器提供getView方法给ListView使用,每次ListView只需提供位置信息给getView函数,然后getView函数根据位置信息向数据源获取对应的数据,根据数据返回不同的View。

模板方法模式

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

这种模式也相当常见,比如我们的activity或者fragment,在base中定义了一些列的周期函数,基本把整个activity的框架全部定义好了,所以我们只需要进程基类的activity或者fragment方法,然后在定义好的周期函数中实现我们需要的内容就可以,而不用关心整个activity的启动所有过程。

代理模式

定义:为其他类提供一种代理以控制这个对象的访问。

在安卓中进程通信是一个很常见的东西,如果需要进行进程通信则可以通过使用AIDL来获取远程service的代理,然后我们可以通过这个代理来执行响应的操作。

private ServiceConnection mServiceConnection = new ServiceConnection(){
     @Override
     public void onServiceConnected(ComponentName name, IBinder service){
            mTransation = ITransactionManager.Stub.asInterface(service);
           ....
      }
}

上面介绍的都是app代码中很常见,并且我们在设计代码是经常会用到的,当然在还有其他很多设计模式没有介绍,这里就不一一介绍了。

时间: 2024-09-30 06:45:11

Android中常见的设计模式的相关文章

Android中常见的内存泄漏

为什么会产生内存泄漏? 当一个对象已经不需要再使用了,本该被回收时,而有另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,这就产生了内存泄漏. 内存泄漏对程序的影响? 内存泄漏是造成应用程序OOM的主要原因之一!我们知道Android系统为每个应用程序分配的内存有限,而当一个应用中产生的内存泄漏比较多时,这就难免会导致应用所需要的内存超过这个系统分配的内存限额,这就造成了内存溢出而导致应用Crash. Android中常见的内存泄漏汇总 1

Android开发中常见的设计模式

对于开发人员来说,设计模式有时候就是一道坎,但是设计模式又非常有用,过了这道坎,它可以让你水平提高一个档次.而在android开发中,必要的了解一些设计模式又是非常有必要的.对于想系统的学习设计模式的同学,这里推荐2本书.一本是Head First系列的Head Hirst Design Pattern,英文好的可以看英文,可以多读几遍.另外一本是大话设计模式. 单例模式 首先了解一些单例模式的概念. 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 这样做有以下几个优点 对于

Android开发中常见的设计模式(一)——单例模式

首先了解一些单例模式的概念. 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 这样做有以下几个优点 对于那些比较耗内存的类,只实例化一次可以大大提高性能,尤其是在移动开发中. 保持程序运行的时候该中始终只有一个实例存在内存中 其实单例有很多种实现方式,但是个人比较倾向于其中1种.可以见单例模式 代码如下 public class Singleton { private static volatile Singleton instance = null; private Sin

Android开发中常见的设计模式(三)——观察者模式

先看下这个模式的定义. 定义对象间的一种一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都能得到通知并被自动更新 先来讲几个情景. 情景1:有一种短信服务,比如天气预报服务,一旦你订阅该服务,你只需按月付费,付完费后,每天一旦有天气信息更新,它就会及时向你发送最新的天气信息. 情景2:杂志的订阅,你只需向邮局订阅杂志,缴纳一定的费用,当有新的杂志时,邮局会自动将杂志送至你预留的地址. 观察上面两个情景,有一个共同点,就是我们无需每时每刻关注我们感兴趣的东西,我们只需做的就是订阅感

Android 中常见控件的介绍和使用

1 TextView文本框 1.1 TextView类的结构 TextView 是用于显示字符串的组件,对于用户来说就是屏幕中一块用于显示文本的区域.TextView类的层次关系如下: java.lang.Object   ? android.view.View   ? android.widget.TextView 直接子类: Button, CheckedTextView, Chronometer, DigitalClock, EditText 间接子类: AutoCompleteTextV

Android中常见Intent习惯用法-上篇(附源码下载)

Android中的Intent是一个非常重要的类,如果对Intent不是特别了解,可以参见博文<Android中Intent概述及使用>.如果对Intent Filter不是特别了解,可以参见博文<Android中Intent对象与Intent Filter过滤匹配过程详解>. 本文着重讲一下Android中一些常见的Intent的习惯用法,比如如何通过Intent发送短信.发送邮件.启动摄像机拍照录视频.设置闹铃.打开WIFI设置界面等等. 限于篇幅,本博文分为上下两篇,这是上篇

Java中常见的设计模式

我在这里稍微总结一下Java中常见的一些设计模式. 1,单例设计模式 单例设计是Java中最常见的模式之一,,它就是要保证程序里边只有一个对象实例.就好比班上都叫他为班长,是因为得保证班上只有一个班长. 单例设计模式的程序设计思想反应的是Java面向对象思想的封装特性.就是为了保证只有一个对象实例,我们私有化它的构造函数,对外只提供一些相关的 公共方法来获得对象实例. 单例设计模式的实现主要分为饿汉式和懒汉式 饿汉式是先对类的对象实例化,随着类的加载对象也加载进来缺点是会造成性能的损耗好处是实现

Android中常见IPC方法总结

欢迎转载,转载请注明出处http://blog.csdn.net/l664675249/article/details/50654926 IPC (Interprocess communication)跨进程通信,是指在两个进程之间交换数据的过程.多进程通信一般分为两种情况.第一种,一个应用因为自身的需要采用多进程实现,比如某些模块由于特殊原因需要运行在单独的进程中.第二种情况,当前应用需要获得其它应用的数据,由于是两个应用,所以必须采用跨进程的方式.下面就对常用的IPC方法做一个总结. 使用B

Android中常见功能包描述

在Android中,各种包写成android.*的方式,重要包的描述如下所示:android.app :提供高层的程序模型.提供基本的运行环境android.content:包含各种的对设备上的数据进行访问和发布的类android.database :通过内容提供者浏览和操作数据库android.graphics:底层的图形库,包含画布,颜色过滤,点,矩形,可以将他们直接绘制到屏幕上.android.location :定位和相关服务的类android.media :提供一些类管理多种音频.视频