Android中的设计模式

设计模式基于Android(一) 经典的23种设计模式是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides(合称“Gang of Four”)在他们的书《设计模式:可复用面向对象软件的基础》中定义的。在 Android 开发中,虽然23种经典设计模式都有可能用到,但一些模式在实际开发中更为常见和实用。尽管有些模式在不同环境中有特定的实现方式,但核心思想依然适用。这些设计模式在Android开发中常见且实用,它们可以帮助我们开发者创建更结构化、可维护和扩展性强的应用程序。 阅读详情

参考文章

1,Android开发中常见的设计模式
http://www.cnblogs.com/android-blogs/p/5530239.html
2,Android源码设计模式分析开源项目
https://github.com/simple-android-framework-exchange/android_design_patterns_analysis
3、 Android 设计模式
http://blog.youkuaiyun.com/banketree/article/details/24985607
4、《Android深入透析》之常用设计模式经验谈
https://my.oschina.net/u/2249934/blog/343441
5、设计模式(有23种模式的应用实例、何时使用等说明)
http://www.runoob.com/design-pattern/design-pattern-tutorial.html
6、传智播客设计模式视频教程
链接:http://pan.baidu.com/s/1i3QNjHN 密码:ezyn
7、Android学习——ActivityManager与Proxy模式的运用
http://www.cnblogs.com/bastard/archive/2012/05/25/2517522.html

单例模式

private static volatile EventBus defaultInstance;
public static EventBus getDefault() {
    if (defaultInstance == null) {
        synchronized (EventBus.class) {
            if (defaultInstance == null) {
                defaultInstance = new EventBus();
            }
        }
    }
    return defaultInstance;
}

Build模式

AlertDialog.Builder builder=new AlertDialog.Builder(this);
AlertDialog dialog=builder.setTitle("标题")
        .setIcon(android.R.drawable.ic_dialog_alert)
        .setView(R.layout.myview)
        .setPositiveButton(R.string.positive, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        })
        .setNegativeButton(R.string.negative, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        })
        .create();
dialog.show();

观察者模式

private List<OnScrollListener> mScrollListeners;
public void addOnScrollListener(OnScrollListener listener) {
    if (mScrollListeners == null) {
        mScrollListeners = new ArrayList<OnScrollListener>();
    }
    mScrollListeners.add(listener);
}
public void removeOnScrollListener(OnScrollListener listener) {
    if (mScrollListeners != null) {
        mScrollListeners.remove(listener);
    }
}
public void clearOnScrollListeners() {
    if (mScrollListeners != null) {
        mScrollListeners.clear();
    }
}

原型模式

public Object clone() {
    return new Bundle(this);
} 
public Bundle(Bundle b) {
    super(b);

    mHasFds = b.mHasFds;
    mFdsKnown = b.mFdsKnown;
}

####浅拷贝和深拷贝
@Override
public Object clone(){//浅拷贝
    Person person=null;
    try {
        person=(Person)super.clone();
        person.name=this.name;
        person.weight=this.weight;
        person.height=this.height;
        person.age=this.age;
        person.hobbies=this.hobbies;
    } catch (CloneNotSupportedException e) {
        e.printStackTrace();
    }
    return person;
}

@Override
public Object clone(){//深拷贝
    Person person=null;
    try {
        person=(Person)super.clone();
        person.name=this.name;
        person.weight=this.weight;
        person.height=this.height;
        person.age=this.age;

        person.hobbies=(ArrayList<String>)this.hobbies.clone();
    } catch (CloneNotSupportedException e) {
        e.printStackTrace();
    }
    return person;
}
//测试代码
public class Main {
    public static void main(String [] args){
        Person p=new Person();
        p.setAge(18);
        p.setName("张三");
        p.setHeight(178);
        p.setWeight(65);
        ArrayList <String> hobbies=new ArrayList<String>();
        hobbies.add("篮球");
        hobbies.add("编程");
        hobbies.add("长跑");
        p.setHobbies(hobbies);
        System.out.println(p);

        Person p1= (Person) p.clone();
        System.out.println(p1);

        p1.setName("李四");
        p1.getHobbies().add("游泳");
        System.out.println("clone test:"+p);//这一句浅拷贝和深拷贝打印有区别,浅拷贝只是拷贝一个印有(没有生成新的对象,原对象和拷贝对象指向的是同一个对象),深拷贝会创建一个新的对象
        System.out.println(p1);
    }
}
//浅拷贝和深拷贝打印的只有"clone test:"+p 这一句有别
//浅拷贝clone test:Person{name=’张三’, age=18, height=178.0, weight=65.0, hobbies=[篮球, 编程, 长跑, 游泳]}
//深拷贝clone test:Person{name=’张三’, age=18, height=178.0, weight=65.0, hobbies=[篮球, 编程, 长跑]}

策略模式

public interface Strategy {
    void travel();
}
public class WalkStrategy implements Strategy{

    @Override
    public void travel() {
        System.out.println("walk");
    }

}
public class PlaneStrategy implements Strategy{

    @Override
    public void travel() {
        System.out.println("plane");
    }

}

工厂模式

public class test {
       public static void main(String[] args) {
              Location position= new LocationFactory().getInstance("xiaomi");
              position.getPosition();
              position.getCityName(10, 20);
       }
}

class LocationFactory{
       public static Location getInstance(String type){
              if("baidu".equals(type)){
                     return new BaiduLocation();
              }else {
                     return new XiaoMiLocation();
              }
       }
}
class BaiduLocation implements Location{
       @Override
       public void getPosition() {
              // TODO Auto-generated method stub
              System.out.println("通过百度定位获取到当前的经纬度是XXXXX");
       }
       @Override
       public void getCityName(long lat, long lng) {
              // TODO Auto-generated method stub
              System.out.println("通过百度定位获取到当前的城市是XXXXX");
       }
}
class XiaoMiLocation implements Location{
       @Override
       public void getPosition() {
              // TODO Auto-generated method stub
              System.out.println("通过小米定位获取到当前的经纬度是XXXXX");
       }
       @Override
       public void getCityName(long lat, long lng) {
              // TODO Auto-generated method stub
              System.out.println("通过小米定位获取到当前的城市是XXXXX");
       }
}
interface Location{
       public void getPosition();
       public void getCityName(long lat,long lng);
}

代理模式

/**什么是代理模式?代理模式在各类开发中运用的相当广泛,不论是j2ee,android还是ios,都能看到它的身影,所以说设计模式无处不在。代理模式,字面理解就是自己不方便做或者不能做的事情,需要第三方代替来做,最终通过第三方来达到自己想要的目的或效果。举例了:员工小李在B总公司打工,B总成天让小李加班不给加班费,小李忍受不住了,就想去法院告B总。虽然法律上允许打官司不请律师,允许自辩。但是小李第一不熟悉法律起诉的具体流程,第二嘴比较笨,人一多腿就抖得厉害。因此,小李决定去找律师帮忙打官司。找律师打官司和自己打官司相比,有相同的地方,也有不同的地方。

相同的地方在于:
1、  都需要提交原告的资料,如姓名、年龄、事情缘由、想达到的目的。
2、  都需要经过法院的取证调查,开庭争辩等过程。
3、  最后拿到审判结果。

不同地方在于:
1、  小李省事了,让专业的人做专业的事,不需要自己再去了解法院那一套繁琐复杂的流程。
2、  把握更大了。


通过上面的例子,我们注意到代理模式有几个重点。
1、  被代理的角色(小李)
2、  代理角色(律师)
3、  协议(不管是代理和被代理谁去做,都需要做的事情,抽象出来就是协议)


下面给个例子:*/

public class Proxy {
       public static void main(String[] args) {
              Employer employer=new Employer();
              System.out.println("我受不了了,我要打官司告老板");
              System.out.println("找律师解决一下吧......");
              Protocol lawyerProxy=new LawyerProxy(employer);
              lawyerProxy.register("朵朵花开");
              lawyerProxy.dosomething();
              lawyerProxy.notifys();
       }
}
interface Protocol{
       //登记资料
       public void register(String name);
       //调查案情,打官司
       public void dosomething();
       //官司完成,通知雇主
       public void notifys();
}
//律师类
class LawyerProxy  implements Protocol{
       private Employer employer;
       public LawyerProxy(Employer employer){
              this.employer=employer;
       }
       @Override
       public void register(String name) {
              // TODO Auto-generated method stub
              this.employer.register(name);
       }

       public void collectInfo(){
              System.out.println("作为律师,我需要根据雇主提供的资料,整理与调查,给法院写出书面文字,并提供证据。");
       }
       @Override
       public void dosomething() {
              // TODO Auto-generated method stub
              collectInfo();
              this.employer.dosomething();
              finish();
       }
       public void finish(){
              System.out.println("本次官司打完了...............");

       }
       @Override
       public void notifys() {
              // TODO Auto-generated method stub
              this.employer.notifys();
       } 
}
//雇主类
class Employer implements Protocol{
       String name=null;
       @Override
       public void register(String name) {
              // TODO Auto-generated method stub
              this.name=name;
       }

       @Override
       public void dosomething() {
              // TODO Auto-generated method stub
              System.out.println("我是'"+this.name+"'要告B总,他每天让我不停的加班,还没有加班费。");
       }

       @Override
       public void notifys() {
              // TODO Auto-generated method stub
              System.out.println("法院裁定,官司赢了,B总需要赔偿10万元精神补偿费。");
       }

}

感悟

不会设计模式的程序员知识结构不完整
面向接口编程、学会使用设计模式可以显著增强程序的可扩展性、可读性

Windows 11下ROS2 Humble与PyCharm无缝集成实战(避坑指南+完整配置流程) 本文详细介绍了在Windows 11系统下如何实现ROS2 Humble与PyCharm的无缝集成,包括环境准备、ROS2 Humble安装、PyCharm配置以及C++与Qt5混合开发的实战技巧。通过避坑指南和完整配置流程,帮助开发者高效搭建稳定的机器人开发环境,特别适合Windows平台的ROS2开发者。 阅读详情

相关推荐

用SOEM库搞定汇川SV660N伺服电机:一个Linux C程序员的EtherCAT实战笔记

本文详细介绍了如何在Linux系统下使用SOEM库驱动汇川SV660N伺服电机,包括环境搭建、EtherCAT从站设备识别、PDO映射配置、状态机切换与运动控制等关键步骤。通过实战代码示例和常见问题排查指南,帮助开发者快速掌握工业自动化中的EtherCAT通信技术,实现对伺服电机的精准控制。

weixin_29185199的博客 424

Android常用的设计模式

定义一系列的算法,将每一个算法都封装起来,并且可相互替换。这使得算法可以独立于调用者而单独变化。为其它对象提供一种代理以控制这个对象的访问。(2).双重检查模式DCL。例子:(自己封装的网络库)(3)静态内部类单例模式。

jokerwangwang的博客 638

手把手教你搞定MT6701磁编码器的SSI通信与CRC-6校验(附避坑代码)

本文详细介绍了MT6701磁编码器的SSI通信与CRC-6校验的实现方法,包括硬件连接、时序配置、数据读取和专用CRC-6算法。通过提供避坑代码和常见问题解决方案,帮助开发者快速掌握磁编芯片的调试技巧,确保通信稳定可靠。

weixin_30872337的博客 218

Android常见设计模式

首先一个重点就是**类的初始化得在一开始就弄,并且是由static修饰** 使用**static关键字创建类的静态变量时,这个变量会在类加载时被初始化**。**在java中,类加载只会发生1次**。因此,如果使用static关键字创建单例对象,那么在类加载时就会创建单例对象。 但是饿汉模式是有一个缺点,就是这个变量会在类加载时被初始化,如果没用过这个实例的话,就容易造成内存的浪费。 这就不符合**懒加载**的效果

m0_61130325的博客 8796

【EPICS学习记录】根据官方教程创建一个IOC应用

参照官网给出的IOC创建教程逐步操作完成了一个IOC应用的创建,官网教程中有部分过程表述的不清晰,自己摸索之后完成了IOC的创建,并把流程记录下来。其中有一些操作不是很理解,有问题或者建议欢迎指正。

yifeng_H的博客 3661

Android常用设计模式

java设计模式

qq_14931305的博客 7508

Windows上MSYS2的安装和使用

MSYS2这个工具我是越用越喜欢,很多东西放在Linux上如鱼得水但是放在Windows上就没那么好用,比如ffmpeg,opencv等直接引用就行了,这个工具真的很省事。接下来带你们看看它的妙用。1、好好研究确实妙用无穷。

jiexijihe945的博客 4141

Android常用设计模式(小白必看)

Java/Kotlin的五大最常用设计模式,通俗易懂

zhoujun798的博客 3583

Linux内存管理(17):percpu 分配器——基本原理

随着 SMP(对称多处理器架构)的发展,在享受处理器更快的执行效率的同时,也为数据同步带来了更大的挑战,因为在 SMP 架构中,程序确实是在并发执行,从单 CPU 只需要考虑调度风险,到SMP 中还需要考虑多 CPU 中同时执行的风险,而且在单 CPU 下乱序执行也会在 SMP 架构中带来,从而也衍生了一些新的同步机制,例如:内存屏障、percpu 机制等等。

私房菜 1249

高通GAIA V3命令参考手册的研读学习(15):自定制命令的详细工作描述

里的示例一样,手机APP发出这个GetManuFacturer的命令发0x0000,那么耳机回复:0x8000, 同时在回复的playload部分,用最多15个字节的ACSII码来表达制造商信息(因此最多15个字母)。那么这个APP在通过GAIA协议控制这个耳机时,不仅可以通过前面讲过的vendor ID来识别,也可以更进一步通过这个命令来识别这个耳机,到底是不是本公司的。通过这个可变长度的playload,真的是可以传达极多的事先约定的信息,相当的灵活,真是不错!这个命令用来得到设备的制造商信息。

qq_37191547的博客 398

Android源码中的部分设计模式

Android源码中广泛使用了多种设计模式,以解决不同场景下的架构设计需求。以下是几个常见的设计模式及其在Android中的应用: 1. 单例模式 (Singleton Pattern) 应用: 单例模式确保一个类只有一个实例,并提供一个全局访问点。 示例: Context: Context 类的实现(尤其是 ApplicationContext)经常以单例的方式使用,以确保全局唯一的应用上下文实例。 ActivityManager: ActivityManager 是 Android 中管理应用进程和活

qq_34358193的博客 1358

手把手教你学Simulink——基于Simulink的输入输出线性化精确转矩控制

由于IOFL控制律中实时引入了当前状态的反馈(id​,iq​,ωe​),电感的变化被非线性项自动补偿,转矩仅出现微小幅度的波动(< 2%),展现出极强的参数鲁棒性。:电压方程中的耦合项(ωe​Lq​iq​和 −ωe​Ld​id​)仅通过前馈补偿,当转速 ωe​较高时,微小的前馈误差会导致显著的d-q轴电流交叉耦合;其中,ud​,uq​为定子电压,id​,iq​为定子电流,Rs​为定子电阻,Ls​为定子电感,ωe​为电角速度,ψf​为永磁体磁链,p为极对数。(步长 Ts​=10μs,即100ns?

MHD0815的博客 84

部分JAVA设计模式在Android中的体现。

设计模式在安卓中的体现 。 代理模式: 创建代理类,就是为其他对象提供一种访问代理, 常用的类ActivityManager,, 它相当于代理模式的类图中的client。在这个类中,可以看到大量的getxxx函数,这些函数, 都会调用到ActivityManagerNative类的getDefault()方法,而该方法会获得一个共用的单例的IActivityManager引用,

693的专栏 473

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android之MVC设计模式在Android中的使用

最近一直在想怎么去优化一下现有的项目的代码和框架,项目中代码的臃肿和繁多在修改需求的时候带来了非常大的不方便,在大的项目工程中,一个好的框架,好的设计模式,能减少很大的工作量,所以最近一直在深入的学习MVC和MVP设计模式,这一篇对对于MVC的介绍非常的简单明了,想学习MVC设计模式的可以看看,欢迎有心得的相互交流,相互学习。 原文地址:http://www.2cto.com/kf/2015

碎火流荧的博客 1731

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

浅谈安卓apk安装过程中的设计模式

最近一直在读安卓安装过程的源代码,也在博客中分析了整个安装流程,但是只是一步步流水账的形式,对代码整体设计架构没涉及,但是看下来安卓framework的设计运用了大量设计模式思想,这种设计模式利于代码架构整体管理以及拓展,但是对于阅读学习分析的人尤其是没有设计模式基础的人来阅读带来了难度,今天针对其中运用的一些设计模式做个简单分析,其中不对之处还望大神指出,本文只是个人理解。 今天刚好看到在进行...

superjaingchao的专栏 389

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Android代码中的设计模式

一、https://www.jianshu.com/p/1a9f571ad7c0 1、 单一职责原则 单一原则很简单,就是将一组相关性很高的函数、数据封装到一个类中。换句话说,一个类应该有职责单一。 2、 开闭原则 开闭原则理解起来也不复杂,就是一个类应该对于扩展是开放的,但是对于修改是封闭的。我们知道,在开放的app或者是系统中,经常需要升级、维护等,这就要对原来的代码进行修改,可是修改时容易破坏原有的系统,甚至带来一些新的难以发现的BUG。因此,我们在一开始编写代码时,就应该注意尽量通过扩展的方式实现新

kkloqin的专栏 707

在mvc中怎么显示用户名_MVP设计模式在安卓编程中的应用

​大家好,这一期呢,我们来谈一下MVP设计模式在安卓编程中的应用。Mvp就是model view presenter。它来源于经典的mvc设计模式。Mvc设计模式可以说是最被广泛使用的设计模式之一了。先说一下为什么要使用mvp?我们都知道在安卓编程中activity是既有ui又有数据访问的一个实体机制。随着程序规模的不断增加,我们需要保持程序的可扩展性和可维护性,因此我们需要对程序的整体架构进行分...

weixin_39859052的博客 134

android中的设计模式

整理自 https://github.com/simple-android-framework-exchange/android_design_patterns_analysis 一、单例模式 1. 模式介绍 模式的定义 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 模式的使用场景 确保某个类有且只有一个对象的场景,例如创建一个对象需要

csy92620的专栏 626

Android Dialog中的Builder设计模式

1.Builder设计模式的定义 Builder模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们。用户不知道内部的具体构建细节。Builder模式是非常类似抽象工厂模式,细微的区别大概只有在反复使用中才能体会到。 2.使用Builde

carlwang100的专栏 1995

谈谈23种设计模式在Android源码及项目中的应用

本文首发于个人博客:Lam’s Blog - 谈谈23种设计模式在Android源码及项目中的应用,文章由MarkDown语法编写,可能不同平台渲染效果不一,如果有存在排版错误图片无法显示等问题,烦请移至个人博客,如果个人博客无法访问可以留言告诉我,转载请声明个人博客出处,谢谢。前言本文将结合实际谈谈23种设计模式,每种设计模式涉及 * 定义:抽象化的定义与通俗的描述,尽量说明清楚其含义与应用场景

Keep Calm and Carry On. 2959

mvc controller 获取ip_MVC设计模式在安卓编程中的应用

大家好,这一期呢,我们来谈一下mvc设计模式在安卓编程中的应用。作为一个程序员,在我们写程序的过程中,我们的首要目标是把功能实现。随着项目规模的不断增加,我们可能需要一些伙伴程序员一起工作。在这种情况下,我们需要我们写的代码被别人所熟识和理解。反之亦然。为了取得这个目标,设计模式,在编程中是不可避免要使用的。这一期我们重点来谈一下mvc设计模式。Mvc就是model view controller...

weixin_39719729的博客 118

小论设计模式及在Android中的应用

本文主要总结下几个常用的设计模式在Android中的使用。涉及到的设计模式如下: 单例模式 工厂模式 策略模式 代理模式 模板方法模式 建造者模式 外观模式 一.单例模式 1.1 模式说明 实现1个类只有1个实例化对象 &amp; 提供一个全局访问点 1.2 作用(解决的问题) 保证1个类只有1个对象,降低对象之间的耦合度 1.3实现方式 其中饿汉模式和静态内部内实现不需要上锁也能保证是线程安...

海峰的博客 2071

Android 源码中的设计模式

面向对象的六大原则 单一职责原则   所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。通俗的说,即一个类只负责一项职责,将一组相关性很高的函数、数据封装到一个类中。 开闭原则   对于扩展是开放的,这意味着模块的行为是可以扩展的。当应用的需求改变时,我们可以

u012482178的专栏 352

Android中的构建器设计模式

Nowadays, Design Patterns play essential roles in designing and developing Android apps because they can provide some best practices for having high quality apps and following clean code principles. O...

weixin_26727575的博客 251
上一篇: Eclipse下使用Android Design Support Library中的控件(比如TabLayout)
下一篇: android 内存泄漏
SeekSage
SeekSage 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄13年 364粉丝 286原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值