Android里的设计模式


一:设计模式分类

经典的23种设计模式是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides(合称“Gang of Four”)在他们的书《设计模式:可复用面向对象软件的基础》中定义的。以下是这些设计模式的分类和简要介绍。

1.1创建型模式

  1. 单例模式 (Singleton):确保一个类只有一个实例,并提供一个全局访问点。
  2. 抽象工厂模式 (Abstract Factory):提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。
  3. 工厂方法模式 (Factory Method):定义一个创建对象的接口,但由子类决定实例化哪个类。
  4. 生成器模式 (Builder):将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
  5. 原型模式 (Prototype):使用原型实例指定创建对象的种类,并通过复制这些原型创建新的对象。

1.2结构型模式

  1. 适配器模式 (Adapter):将一个类的接口转换成客户希望的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。
  2. 桥接模式 (Bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。
  3. 组合模式 (Composite):将对象组合成树形结构以表示“部分-整体”的层次结构,使得客户端对单个对象和组合对象的使用具有一致性。
  4. 装饰模式 (Decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
  5. 外观模式 (Facade):为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这一接口使得这一子系统更加容易使用。
  6. 享元模式 (Flyweight):运用共享技术有效地支持大量细粒度的对象。
  7. 代理模式 (Proxy):为其他对象提供一种代理以控制对这个对象的访问。

1.3行为型模式

  1. 责任链模式 (Chain of Responsibility):为请求创建一个接收者对象的链,这种模式使得多个对象都有机会处理请求,避免了请求的发送者和接收者之间的耦合。
  2. 命令模式 (Command):将一个请求封装为一个对象,从而使您可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
  3. 解释器模式 (Interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
  4. 迭代器模式 (Iterator):提供一种方法顺序访问一个聚合对象中的各个元素,而又不需暴露该对象的内部表示。
  5. 中介者模式 (Mediator):用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
  6. 备忘录模式 (Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后恢复对象为先前的状态。
  7. 观察者模式 (Observer):定义对象间的一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
  8. 状态模式 (State):允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
  9. 策略模式 (Strategy):定义一系列的算法,把它们一个个封装起来,并且使它们可以互换,本模式使得算法可独立于使用它的客户而变化。
  10. 模板方法模式 (Template Method):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
  11. 访问者模式 (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开发中常见且实用,它们可以帮助我们开发者创建更结构化、可维护和扩展性强的应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/29222.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openEuler 2203 中利用ebpf实现文件变更监控

在利用ebpf监控文件变更操作中,记录一些内核参数获取的过程。 1.环境信息 openeuler 2203 2.常用的修改文件的方式或者命令 1).直接使用文件系统的操作接口,比如write等; 2.)系统命令,比如vim/vi,sed,echo,cp,mv 涉及到的系统调用主要有: sys_enter_write sys_enter_rena…

多模态AI和机器人技术的演变

1. 引言 多模态AI模型能够处理各种任务的趋势正在激发机器人技术的进步。这些模型通过结合视觉、听觉、触觉等多种感知方式,赋予机器人更多的智能和灵活性。像DeepMind的Robocat这样的创新展示了这些模型如何使机器人执行多种功能。本文将突出这一领域的最新发展,并对未来的…

AI + 3D:用单个图像和文本提示创建可交互的3D世界

你是否曾经梦想过只需一张照片和一些简单的文字描述,就能立即进入一个生动的3D虚拟世界?今天,我们将介绍一个革命性的技术,它就像是一台神奇的3D场景制造机,能够根据你的想象快速构建出令人惊叹的虚拟空间。 一、技术概览 这项技术不仅仅是一个简单的图像到3D的转换工具…

【免费API推荐】:轻松集成,为您的应用增添更多价值(9)

开发者喜爱的免费API是他们在开发过程中最宝贵的伙伴。这些API提供了丰富的功能和数据&#xff0c;帮助开发者构建出令人惊叹的应用。无论是地图服务、社交媒体集成、数据分析还是人工智能&#xff0c;这些免费API为开发者提供了强大的工具和资源&#xff0c;让他们能够更轻松地…

Uni-App中的u-datetime-picker时间选择器Demo

目录 前言Demo 前言 对于网页端的推荐阅读&#xff1a;【ElementUI】详细分析DatePicker 日期选择器 事情起因是两个时间选择器同步了&#xff0c;本身是从后端慢慢步入全栈&#xff0c;对此将这个知识点从实战进行提炼 通过Demo进行总结 Demo 用于选择日期和时间的组件&a…

为什么选择住宅代理?IPXProxy住宅代理的优势

​在数字化时代&#xff0c;隐私和数据安全成为了每个互联网用户的关注焦点。住宅代理作为一种有效保护隐私的工具&#xff0c;因其独特的优势备受推崇。本文将从用户的角度&#xff0c;探讨选择住宅代理的诸多优势。 什么是住宅代理&#xff1f; 简单来说&#xff0c;住宅代理…

c++学习 文件操作,模板

文件操作 #include<iostream> #include<string> #include<fstream> using namespace std; //文本操作 //程序运行时产生的数据都属于临时数据&#xff0c;程序一旦运行结束都会被释放 //通过文件可以数据持久化 //c中对文件操作包含头文件<fstream> /…

06眼动识别系统-改版

06眼动识别系统-改版 原先的模块组成示意图优缺点 新模块设计优缺点 软件方面结语其他以下是废话 试验&#xff0c;本身就是一个摸索的过程&#xff0c;在上一阶段的试验中&#xff0c;我们发现硬件的连接模式&#xff0c;给试验造成了很多麻烦&#xff0c;所以决定对硬件的连接…

leaflet室内地图\平面图点线面绘制

需求&#xff1a; 用户自定义上传一张平面图&#xff0c;然后可以在平面图内标点、绘制面、并且能够弹出相对应点、面的信息&#xff0c;信息可编辑&#xff0c;类似下图&#xff1a; 相关实现技术&#xff1a;leaflet 中文网&#xff1a;Leaflet - 一个交互式地图 JavaScript…

游戏运营与发行:从入门到实践

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

Ubuntu系列-fzf最新版安装

fzf 简介 fzf 是一个强大的命令行模糊查找工具,能够在文件、历史命令、Git 提交等各种数据源中快速定位你需要的内容。其全称为 "fuzzy finder"。fzf 以其高效、简洁和灵活著称,特别适合在大型项目或繁杂数据中快速搜索和导航。 核心功能 模糊搜索: 无需输入完…

在有限的分数有限下如何抉择?是选好专业还是选好学校

随着2024年高考的落幕&#xff0c;无数考生和家长站在了人生的重要十字路口。面对成绩单上的数字&#xff0c;一个难题摆在了面前&#xff1a;在分数限制下我们该如何平衡“心仪的专业”与“知名度更高的学校”之间的选择&#xff1f; 一、专业决定未来职业走向 选择一个好的专…

基本类型为什么可以调用方法?

在JavaScript中&#xff0c;基本类型&#xff08;如数字、字符串、布尔值&#xff09;本身是不具备方法的&#xff0c;因为它们不是对象。然而&#xff0c;当你尝试在一个基本类型上调用方法时&#xff0c;JavaScript 会临时将基本类型包装成相应的对象类型&#xff0c;从而使得…

基于51单片机的脉搏测量仪—心率计

基于51单片机的脉搏测量仪 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 本系统由STC89C51/52单片机LCD1602显示模块5mm红外接收管LM358运放电路按键模块等构成 1.手指放到红外对管中&#xff0c;2…

Paragon NTFS For Mac 15软件下载_Paragon NTFS For Mac 15官网最新版下载

Paragon NTFS For Mac 15是一款强大的Mac读写工具。paragon ​​ntfs for mac​​​中文版为您轻松解决Mac不能识别 Windows NTFS文件难题&#xff0c;简单自如读写NTFS外置存储文件。在Mac OS X下全读/写访问NTFS的任何分区&#xff0c;paragon ntfs for mac中文版实现在Windo…

PostgreSQL源码分析——pg_control

pg_control为什么会存在&#xff1f; 为啥会有pg_control这么个文件呢&#xff1f; pg_control是PostgreSQL中一个很重要的文件&#xff0c;我们之前讲到过PostgreSQL的启动过程&#xff0c;启动过程中很重要的一项工作就是故障恢复&#xff0c;启动startup进程&#xff0c;回…

OpenSearch 与 Elasticsearch主要差异

1. 什么是 Elasticsearch&#xff1f; Elasticsearch 是一个基于 Apache Lucene 构建的开源、RESTful、分布式搜索和分析引擎。它旨在处理大量数据&#xff0c;使其成为日志和事件数据管理的流行选择。 Elasticsearch 还以其实时功能而闻名&#xff0c;允许用户在数据模式发生…

GO RACE 测试在低版本GCC上报错误 exit status 0xc0000139

windows机器环境&#xff0c;go程序使用race定位时一运行就报错&#xff0c;写了个example如&#xff1a; 能看到加了race之后就不行了&#xff0c; 搜了一下&#xff0c;git上有个issue&#xff1a; runtime: Race detector causes exit status 0xc0000139 on Windows 11 wi…

酷开会员 | 酷开系统将艺术、回忆与浪漫融入生活

随着审美观念的改变以及技术的提升&#xff0c;消费者对家用电视的需求已不局限于单纯的功能性&#xff0c;外观设计带来的美感与视觉效果也愈发成为消费者关注的焦点。在画质和功能逐步完善的当下&#xff0c;电视中的壁纸模式&#xff0c;则能让其更好地融入家居环境&#xf…

PostgreSQL源码分析 —— FunctionScan

本文分析一下FunctionScan的源码&#xff0c;加深一下理解。以SELECT * FROM generate_series(2,4);为例进行分析。 postgrespostgres# SELECT * FROM generate_series(2,4);generate_series -----------------234 (3 rows)postgrespostgres# explain SELECT * FROM generate…