Android里的设计模式
一:设计模式分类
经典的23种设计模式是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides(合称“Gang of Four”)在他们的书《设计模式:可复用面向对象软件的基础》中定义的。以下是这些设计模式的分类和简要介绍。
1.1创建型模式
- 单例模式 (Singleton):确保一个类只有一个实例,并提供一个全局访问点。
- 抽象工厂模式 (Abstract Factory):提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。
- 工厂方法模式 (Factory Method):定义一个创建对象的接口,但由子类决定实例化哪个类。
- 生成器模式 (Builder):将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
- 原型模式 (Prototype):使用原型实例指定创建对象的种类,并通过复制这些原型创建新的对象。
1.2结构型模式
- 适配器模式 (Adapter):将一个类的接口转换成客户希望的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。
- 桥接模式 (Bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。
- 组合模式 (Composite):将对象组合成树形结构以表示“部分-整体”的层次结构,使得客户端对单个对象和组合对象的使用具有一致性。
- 装饰模式 (Decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
- 外观模式 (Facade):为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这一接口使得这一子系统更加容易使用。
- 享元模式 (Flyweight):运用共享技术有效地支持大量细粒度的对象。
- 代理模式 (Proxy):为其他对象提供一种代理以控制对这个对象的访问。
1.3行为型模式
- 责任链模式 (Chain of Responsibility):为请求创建一个接收者对象的链,这种模式使得多个对象都有机会处理请求,避免了请求的发送者和接收者之间的耦合。
- 命令模式 (Command):将一个请求封装为一个对象,从而使您可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
- 解释器模式 (Interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
- 迭代器模式 (Iterator):提供一种方法顺序访问一个聚合对象中的各个元素,而又不需暴露该对象的内部表示。
- 中介者模式 (Mediator):用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
- 备忘录模式 (Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后恢复对象为先前的状态。
- 观察者模式 (Observer):定义对象间的一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
- 状态模式 (State):允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
- 策略模式 (Strategy):定义一系列的算法,把它们一个个封装起来,并且使它们可以互换,本模式使得算法可独立于使用它的客户而变化。
- 模板方法模式 (Template Method):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
- 访问者模式 (Visitor):表示一个作用于某对象结构中的各元素的操作,它使您可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
这些设计模式在Android开发中也有很多应用,可以帮助开发者设计更好的架构和解决常见问题。尽管有些模式在不同环境中有特定的实现方式,但核心思想依然适用。
二:Android中的使用
在 Android 开发中,虽然23种经典设计模式都有可能用到,但一些模式在实际开发中更为常见和实用。以下是Android开发中常用的设计模式及其应用场景:
1. 单例模式 (Singleton)
应用场景:
- 全局唯一的实例,如网络管理器、数据库管理器、SharedPreferences管理器等。
示例:
public class NetworkManager {private static NetworkManager instance;private NetworkManager() {}public static synchronized NetworkManager getInstance() {if (instance == null) {instance = new NetworkManager();}return instance;}
}
2. 工厂方法模式 (Factory Method)
应用场景:
- 根据条件动态创建不同的对象,如Fragment的实例化。
示例:
public abstract class Fragment {public static Fragment newInstance(String type) {if (type.equals("home")) {return new HomeFragment();} else if (type.equals("settings")) {return new SettingsFragment();} else {return null;}}
}
3. 观察者模式 (Observer)
应用场景:
- 事件总线,LiveData,ViewModel和UI组件之间的数据绑定。
示例:
public class UserViewModel extends ViewModel {private MutableLiveData<User> user = new MutableLiveData<>();public LiveData<User> getUser() {return user;}public void setUser(User user) {this.user.setValue(user);}
}
4. 模板方法模式 (Template Method)
应用场景:
- 定义Activity或Fragment的生命周期方法。
示例:
public abstract class BaseActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(getLayoutId());initialize();}protected abstract int getLayoutId();protected abstract void initialize();
}
5. 适配器模式 (Adapter)
应用场景:
- RecyclerView适配器、ListView适配器。
示例:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {private List<String> data;public MyAdapter(List<String> data) {this.data = data;}@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view, parent, false);return new ViewHolder(view);}@Overridepublic void onBindViewHolder(ViewHolder holder, int position) {holder.textView.setText(data.get(position));}@Overridepublic int getItemCount() {return data.size();}public static class ViewHolder extends RecyclerView.ViewHolder {TextView textView;public ViewHolder(View itemView) {super(itemView);textView = itemView.findViewById(R.id.textView);}}
}
6. 代理模式 (Proxy)
应用场景:
- Retrofit的动态代理,用于创建API接口实例。
示例:
public interface ApiService {@GET("users/{user}")Call<User> getUser(@Path("user") String user);
}Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.github.com/").addConverterFactory(GsonConverterFactory.create()).build();ApiService service = retrofit.create(ApiService.class);
7. 责任链模式 (Chain of Responsibility)
应用场景:
- 事件分发机制,如触摸事件的传递。
示例:
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {if (onInterceptTouchEvent(ev)) {return onTouchEvent(ev);}return super.dispatchTouchEvent(ev);
}
8. 享元模式 (Flyweight)
应用场景:
- 优化内存使用,如复用View对象。
示例:
@Override
public View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {convertView = LayoutInflater.from(context).inflate(R.layout.item_view, parent, false);}// Bind data to the viewreturn convertView;
}
9. 装饰模式 (Decorator)
应用场景:
- 动态添加功能,如View的装饰器。
示例:
public class BorderDecorator extends View {private View view;public BorderDecorator(View view) {super(view.getContext());this.view = view;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// Draw borderview.draw(canvas);}
}
10. 迭代器模式 (Iterator)
应用场景:
- 处理集合类,如遍历数据列表。
示例:
List<String> list = new ArrayList<>();
for (String item : list) {// Process item
}
这些设计模式在Android开发中常见且实用,它们可以帮助我们开发者创建更结构化、可维护和扩展性强的应用程序。
相关文章:
Android里的设计模式
一:设计模式分类 经典的23种设计模式是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides(合称“Gang of Four”)在他们的书《设计模式:可复用面向对象软件的基础》中定义的。以下是这些设计模式的分类和简要介绍。 1.…...
token无感刷新
Token无感刷新通常指的是在用户不知情的情况下自动刷新认证Token,以保持用户的会话状态。这通常在使用JWT(JSON Web Tokens)作为认证方式时使用。以下是实现无感刷新的一种常见方法: 1. 前端请求拦截: 在发送请求前&a…...
Golang的协程调度器GMP
目录 GMP 含义 设计策略 全局队列 P的本地队列 GMP模型以及场景过程 场景一 场景2 场景三 场景四 场景五 场景六 GMP 含义 协程调度器,它包含了运行协程的资源,如果线程想运行协程,必须先获取P,P中还包含了可运行的G…...
C++ 后端,Vue前端
参考2篇博客 1-VUE、C前后端调用 2-Vue解决CORS header ‘Access-Control-Allow-Origin’ missing及同源、跨域问题 这里给出App.vue代码 <script setup lang"ts"> import HelloWorld from ./components/HelloWorld.vueimport axios from axios import { ref…...
使用Navicat Premium向mysql插入2000000条数据
DELIMITER // DROP PROCEDURE IF EXISTS sys_log; CREATE PROCEDURE sys_log() BEGIN DECLARE n int DEFAULT 1; WHILE(n<2000000) DO INSERT INTO sys_log VALUES (n, 超级系统管理员, 查询实时工况数据, /keyParameterMonitoring/getNewestUnitData, {\"role\"…...
docker命令记录
基本命令和参数 docker run: 运行一个新的容器实例。-itd: 组合参数,含义如下: -i: 以交互模式运行容器,保持标准输入打开。-t: 分配一个伪终端。-d: 后台运行容器,即使容器启动后依然返回控制台。 设备映射 --device/dev/dri…...
Java学习七
Java包 String对象 String案例 集合 ArrayList 集合...
麒麟Kylin | 操作系统的安装与管理
以下所使用的环境为:VMware Workstation 17 Pro、Kylin-Server-10-SP2-x86-Release-Build09-20210524 一、创建虚拟机 在VMware主机单击【创建新的虚拟机】 **在新建虚拟机向导中选择【自定义】,然后点击【下一步】 ** 保持默认选项,然后…...
数据结构预备知识(Java):包装类泛型
1、包装类 1.1 包装类 在Java中,每一个基本数据类型都有一个对应的包装类: 在SE的学习中我们已有过简单了解。 我们可以注意到,除了int类型的包装类为Integer,char类型的包装类为Character外,其余基本类型的包装类均…...
掌握Linux Vim:从基础到高级的全面指南
Vim是一款在Linux世界中备受推崇的文本编辑器,它以其强大的功能和高效的操作模式闻名于世。尽管Vim的学习曲线较陡,但一旦掌握,你将发现它在代码编辑和文本处理方面的无与伦比的优势。本文将从Vim的基础知识开始,逐步深入到高级用法和技巧,帮助你全面掌握这款强大的编辑器…...
打好“组合拳”,实现国有企业降本增效
在当前经济不确定性加剧、市场寒意明显的背景下,众多国有企业因历史积累的管理问题而陷入困境。随着经济形势的严峻,各行业普遍出现发展乏力的现象,促使企业开始重视“修炼内功”、“向内挖潜”,试图控制成本,以确保平…...
四川古力未来科技有限公司抖音小店解锁电商新机遇
在数字化浪潮席卷全球的今天,电商行业正以前所未有的速度蓬勃发展。四川古力未来科技有限公司紧跟时代步伐,积极拥抱变革,在抖音平台上开设小店,为品牌发展注入了新的活力。那么,四川古力未来科技有限公司抖音小店究竟…...
Maven之介绍
目录 一、简介 (2)为什么学习Maven? 二、小结 一、简介 (1)Maven 是一个 Java 项目管理和构建工具。它可以定义项目结构、项目依赖,并使用统一的方式进行自动化构建,是Java项目不可缺少的工具…...
简单了解java中的File类
1、File类 1.1、概述 File对象就表示一个路径,可以是文件路径也可以是文件夹路径,这个路径可以 是存在的,也可以是不存在的。 1.2、常见的构造方法 方法名称说明public File(String pathname)根据文件路径创建文件…...
边缘检测(一)-灰度图像边缘检测方法
灰度图像边缘检测是数字图像处理与机器视觉中经常遇到的一个问题,边缘检测是否连续、光滑是判断检测方法优劣的一个重要标准,下面通过一个实例提供灰度图像边缘检测方法,该方法对其他图像检测也具有一定的参考价值。 首先,读入一幅…...
2025计算机毕业设计选题题目推荐-毕设题目汇总大全
选题在于精,以下是推荐的容易答辩的选题: SpringBoot Vue选题: 基于SpringBoot Vue家政服务系统 基于SpringBoot Vue非物质文化遗产数字化传承 基于SpringBoot Vue兽医站管理系统 基于SpringBoot Vue毕业设计选题管理系统 基于SpringBoot Vue灾害应急救援…...
简易版 | 代码生成器(包含插件)
一、代码生成器 先导入依赖 <!-- Mybatis-Plus --> <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.6</version> </dependency><!-- 代码生成器 --…...
【Python】Redis数据库
Redis数据库 Unit01一、Redis1.1 概述1.2 安装1.3 Redis-cli1.4 数据类型1.5 字符处理1.6 键的命名规则 二、通用命令三、字符串(String)3.1 概述3.2 常用命令3.3 应用场景 四、列表(List)4.1 概述4.2 常用命令 五、集合(SET)5.1 概述5.3 常用命令 六、有序集合6.1 概述6.2 常用…...
理解并应用:JavaScript响应式编程与事件驱动编程的差异
背景介绍 在现代JavaScript开发中,响应式编程(Reactive Programming)和事件驱动编程(Event-Driven Programming)是两种非常重要且常用的编程范式。虽然它们都用于处理异步操作,但在理念和实现方式上存在显…...
第4天:用户认证系统实现
第4天:用户认证系统实现 目标 实现用户认证系统,包括用户注册、登录、登出和密码管理。 任务概览 使用Django内置的用户认证系统。创建用户注册和登录表单。实现用户登出和密码重置功能。 详细步骤 1. 使用Django内置的用户认证系统 Django提供了…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
