做购物网站之前做些什么,网线制作实训报告心得体会,怎样保存网站资料做证据,怎么做网站聊天视频直播一. 前言
学习RxJava#xff0c;少不了介绍它的设计模式。但我看大部分文章#xff0c;都是先将其用法介绍一通#xff0c;然后再结合其用法#xff0c;讲解其设计模式。这样当然有很多好处#xff0c;但我个人觉得#xff0c;这种介绍方式#xff0c;对于没有接触过Rx…一. 前言
学习RxJava少不了介绍它的设计模式。但我看大部分文章都是先将其用法介绍一通然后再结合其用法讲解其设计模式。这样当然有很多好处但我个人觉得这种介绍方式对于没有接触过RxJava的朋友来说是不太友好的。
而我更倾向于先把对设计模式的认知拉齐然后在讲到用法的时候大家就会自然而然地理解了它怎么用到的设计模式从而也就更容易理解源码了一切都是水到渠成。
所以在本篇文章中大部分内容依然不会涉及RxJava但其实处处都有RxJava的影子。你需要做的就是完全理解本篇文章的内容没有理解到的地方请留言我都会一个一个认真看的。 不啰嗦了让我们开始正题吧
二. 观察者模式
1. 什么是观察者模式
一个比较书面化的定义是在对象之间定义一个一对多的依赖当一个对象状态改变的时候所有依赖的对象都会自动收到通知。
通俗一点理解假如说有两种对象一个是观察者一个是被观察者当一个被观察者对象发生变化的时候可以通知到所有的观察者对象。所有的观察者对象在接收到这个通知的时候可以做一些自己的处理。
2. Android中有没有例子
在Android中观察者模式其实很常见比如点击事件监听当view被点击的时候会通知到它的观察者也就是调用到你实现的onClick方法。再比如说EventBus比如LiveData其实都有运用到观察者模式。
3. 写个代码
本着KISS原则Keep It Simple, Stupid观察者模式比较简单所以在这里就不写代码了。 但值得一提的是RxJava中运用到的观察者模式和这里有一点微小的差别但根本思想是一样的。至于是什么微小的差别等讲到RxJava原理的时候你就理解了。
三. 装饰器模式
1. 什么是装饰器模式
可以通俗地理解为在不改变原有对象的基础上增强原有对象的功能。
2. Android中有没有例子
我们天天接触的Context就是一个非常典型的装饰器模式的例子。
Android中的Context对象是一个核心的组件它经常被装饰器进行功能扩展和定制。例如Activity、Service、BroadcastReceiver等都是Context的子类它们在基本的Context功能上添加了更多的生命周期管理、界面交互和事件处理等功能。
相当于在没有修改Context的基础上对Context进行了功能的增强。
3. 写个代码
因为我们平时关于装饰器模式写的不是很多所以我觉得有必要以一个很简单的例子向大家再进一步介绍下装饰器模式。 假设你经营一家咖啡店你的顾客可以根据自己的口味定制咖啡。首先我们有一个抽象的咖啡接口
public interface Coffee {String getDescription();double getCost();
}然后我们还有一个具体的咖啡实现
public class SimpleCoffee implements Coffee {Overridepublic String getDescription() {return Simple Coffee;}Overridepublic double getCost() {return 1.0;}
}现在我们不满足于一个简单的咖啡SimpleCoffee而是要有一个可以加入牛奶的咖啡。相当于对原有的咖啡功能进行增强这时我们就可以借助装饰器模式来实现。 首先声明一个装饰器模式的抽象类也实现Coffee接口。
public abstract class CoffeeDecorator implements Coffee {protected Coffee coffee;public CoffeeDecorator(Coffee coffee) {this.coffee coffee;}Overridepublic String getDescription() {return coffee.getDescription();}Overridepublic double getCost() {return coffee.getCost();}
}然后可以创建一个具体的装饰器类
public class MilkDecorator extends CoffeeDecorator {public MilkDecorator(Coffee coffee) {super(coffee);}Overridepublic String getDescription() {return super.getDescription() , Milk;}Overridepublic double getCost() {return super.getCost() 0.5;}
}这样我们在使用的时候顾客可以选择加入咖啡而不会改变原有的咖啡类
Coffee simpleCoffee new SimpleCoffee();
Coffee coffeeWithMilk new MilkDecorator(simpleCoffee);
System.out.println(coffeeWithMilk.getDescription()); // 输出Simple Coffee, Milk
System.out.println(coffeeWithMilk.getCost()); // 输出1.5为什么实现了同一个接口
这里大家也会发现一个细节就是装饰器类和被装饰类都实现了同一个接口在这个例子中就是Coffee接口。这样做的好处就是可以统一以Coffee来接收装饰器类和被装饰类这使得客户端可以根据需求自由组合装饰器对象以获得所需的功能组合方便多次嵌套自己可以作为装饰器类也可以作为被装饰类实现更灵活符合“基于接口而非实现”的规范。
举个例子假如客户还想加糖那么就可以新增一个加糖的装饰器类
public class SugerDecorator extends CoffeeDecorator {public SugerDecorator(Coffee coffee) {super(coffee);}Overridepublic String getDescription() {return super.getDescription() , Suger;}Overridepublic double getCost() {return super.getCost() 0.3;}
}然后顾客如果既想加糖又想加牛奶就可以这样实现
Coffee simpleCoffee new SimpleCoffee();
Coffee coffeeWithMilk new MilkDecorator(simpleCoffee);
Coffee coffeeWithSuger new SugerDecorator(coffeeWithMilk);可以看到MilkDecorator本身既是装饰器类也是被装饰类使得原有对象的功能可以定制化地增强。而能够实现这些的原因就是装饰器类和被装饰类实现了同一个接口
四. 总结
本篇文章内容就到这里了其实本篇文章没有提到RxJava的具体知识但其实处处都有RxJava的影子。在本篇文章中你只需要牢牢掌握观察者模式和装饰器模式理解我举的例子就可以了。等看到RxJava的原理的文章时你就会豁然开朗
Android 学习笔录
Android 性能优化篇https://qr18.cn/FVlo89 Android 车载篇https://qr18.cn/F05ZCM Android 逆向安全学习笔记https://qr18.cn/CQ5TcL Android Framework底层原理篇https://qr18.cn/AQpN4J Android 音视频篇https://qr18.cn/Ei3VPD Jetpack全家桶篇内含Composehttps://qr18.cn/A0gajp Kotlin 篇https://qr18.cn/CdjtAF Gradle 篇https://qr18.cn/DzrmMB OkHttp 源码解析笔记https://qr18.cn/Cw0pBD Flutter 篇https://qr18.cn/DIvKma Android 八大知识体https://qr18.cn/CyxarU Android 核心笔记https://qr21.cn/CaZQLo Android 往年面试题锦https://qr18.cn/CKV8OZ 2023年最新Android 面试题集https://qr18.cn/CgxrRy Android 车载开发岗位面试习题https://qr18.cn/FTlyCJ 音视频面试题锦https://qr18.cn/AcV6Ap