Glide设计模式之空对象模式【EmptyModelLoader】【EmptyList<E>】
2021/12/31 6:08:49
本文主要是介绍Glide设计模式之空对象模式【EmptyModelLoader】【EmptyList<E>】,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
定义
在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值,而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。
在空对象模式中,我们创建一个指定各种要执行的操作的抽象类和扩展该类的实体类,还创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。
已发现的空对象模式如下列表:
- EmptySet
- EmptyList
- EmptyMap<K, V>
- EmptyLibraryModule1
- EmptyLibraryModule2
- EmptyLibraryGlideModuleTest
- EMPTY_CALLBACKS
- EmptyAppModule
- EmptyModelLoader
EmptySet
private static class EmptySet<E> extends AbstractSet<E> implements Serializable { private static final long serialVersionUID = 1582296315990362920L; private EmptySet() { } public Iterator<E> iterator() { return Collections.emptyIterator(); } public int size() { return 0; } public boolean isEmpty() { return true; } public boolean contains(Object var1) { return false; } public boolean containsAll(Collection<?> var1) { return var1.isEmpty(); } public Object[] toArray() { return new Object[0]; } public <T> T[] toArray(T[] var1) { if (var1.length > 0) { var1[0] = null; } return var1; } public void forEach(Consumer<? super E> var1) { Objects.requireNonNull(var1); } public boolean removeIf(Predicate<? super E> var1) { Objects.requireNonNull(var1); return false; } public Spliterator<E> spliterator() { return Spliterators.emptySpliterator(); } private Object readResolve() { return Collections.EMPTY_SET; } }
EmptyList
public static final Set EMPTY_SET = new Collections.EmptySet(); public static final List EMPTY_LIST = new Collections.EmptyList(); public static final Map EMPTY_MAP = new Collections.EmptyMap(); public static final <T> List<T> emptyList() { return EMPTY_LIST; } private static class EmptyList<E> extends AbstractList<E> implements RandomAccess, Serializable { private static final long serialVersionUID = 8842843931221139166L; private EmptyList() { } public Iterator<E> iterator() { return Collections.emptyIterator(); } public ListIterator<E> listIterator() { return Collections.emptyListIterator(); } public int size() { return 0; } public boolean isEmpty() { return true; } public boolean contains(Object var1) { return false; } public boolean containsAll(Collection<?> var1) { return var1.isEmpty(); } public Object[] toArray() { return new Object[0]; } public <T> T[] toArray(T[] var1) { if (var1.length > 0) { var1[0] = null; } return var1; } public E get(int var1) { throw new IndexOutOfBoundsException("Index: " + var1); } public boolean equals(Object var1) { return var1 instanceof List && ((List)var1).isEmpty(); } public int hashCode() { return 1; } public boolean removeIf(Predicate<? super E> var1) { Objects.requireNonNull(var1); return false; } public void replaceAll(UnaryOperator<E> var1) { Objects.requireNonNull(var1); } public void sort(Comparator<? super E> var1) { } public void forEach(Consumer<? super E> var1) { Objects.requireNonNull(var1); } public Spliterator<E> spliterator() { return Spliterators.emptySpliterator(); } private Object readResolve() { return Collections.EMPTY_LIST; } }
EmptyMap<K, V>
private static class EmptyMap<K, V> extends AbstractMap<K, V> implements Serializable { private static final long serialVersionUID = 6428348081105594320L; private EmptyMap() { } public int size() { return 0; } public boolean isEmpty() { return true; } public boolean containsKey(Object var1) { return false; } public boolean containsValue(Object var1) { return false; } public V get(Object var1) { return null; } public Set<K> keySet() { return Collections.emptySet(); } public Collection<V> values() { return Collections.emptySet(); } public Set<Entry<K, V>> entrySet() { return Collections.emptySet(); } public boolean equals(Object var1) { return var1 instanceof Map && ((Map)var1).isEmpty(); } public int hashCode() { return 0; } public V getOrDefault(Object var1, V var2) { return var2; } public void forEach(BiConsumer<? super K, ? super V> var1) { Objects.requireNonNull(var1); } public void replaceAll(BiFunction<? super K, ? super V, ? extends V> var1) { Objects.requireNonNull(var1); } public V putIfAbsent(K var1, V var2) { throw new UnsupportedOperationException(); } public boolean remove(Object var1, Object var2) { throw new UnsupportedOperationException(); } public boolean replace(K var1, V var2, V var3) { throw new UnsupportedOperationException(); } public V replace(K var1, V var2) { throw new UnsupportedOperationException(); } public V computeIfAbsent(K var1, Function<? super K, ? extends V> var2) { throw new UnsupportedOperationException(); } public V computeIfPresent(K var1, BiFunction<? super K, ? super V, ? extends V> var2) { throw new UnsupportedOperationException(); } public V compute(K var1, BiFunction<? super K, ? super V, ? extends V> var2) { throw new UnsupportedOperationException(); } public V merge(K var1, V var2, BiFunction<? super V, ? super V, ? extends V> var3) { throw new UnsupportedOperationException(); } private Object readResolve() { return Collections.EMPTY_MAP; } }
EmptyLibraryModule1
package com.bumptech.glide.test; import com.bumptech.glide.annotation.GlideModule; import com.bumptech.glide.module.LibraryGlideModule; @GlideModule public final class EmptyLibraryModule1 extends LibraryGlideModule {}
EmptyLibraryModule2
package com.bumptech.glide.test; import com.bumptech.glide.annotation.GlideModule; import com.bumptech.glide.module.LibraryGlideModule; @GlideModule public final class EmptyLibraryModule2 extends LibraryGlideModule {}
EmptyLibraryGlideModuleTest
/** Tests adding a single {@link com.bumptech.glide.module.LibraryGlideModule} in a project. */ @RunWith(JUnit4.class) public class EmptyLibraryGlideModuleTest implements CompilationProvider {
EMPTY_CALLBACKS
private static final DecodeCallbacks EMPTY_CALLBACKS = new DecodeCallbacks() { @Override public void onObtainBounds() { // Do nothing. } @Override public void onDecodeComplete(BitmapPool bitmapPool, Bitmap downsampled) { // Do nothing. } };
EmptyAppModule
package com.bumptech.glide.test; import com.bumptech.glide.annotation.GlideModule; import com.bumptech.glide.module.AppGlideModule; @GlideModule public final class EmptyAppModule extends AppGlideModule {}
EmptyModelLoader
private static class EmptyModelLoader implements ModelLoader<Object, Object> { @Synthetic EmptyModelLoader() {} @Nullable @Override public LoadData<Object> buildLoadData( @NonNull Object o, int width, int height, @NonNull Options options) { return null; } @Override public boolean handles(@NonNull Object o) { return false; } }
package com.bumptech.glide.test; import com.bumptech.glide.annotation.GlideModule; import com.bumptech.glide.module.AppGlideModule; @GlideModule public final class EmptyAppModule extends AppGlideModule {}
总结
空对象模式的使用很是贯彻了面向对象编程的理念。
在使用逻辑上也很贴近业务的表达
面试
什么是面向对象编程
答:举例空对象模式回答即可。即高级的回答了面向对象编程的内涵,又侧面的凸显出对设计模式的理解和认识。比较好的加分项。当然如果技术面试官听得有些懵,那你还是老老实实把面向对象编程的定义进行教科书式的背诵。相信我你会碰到对设计模式不了解的面试官的。当然这也能从侧面探知到这家公司的技术实力在哪个层次。碰到这样的公司不用客气直接把预期待遇提高一个档次。
这篇关于Glide设计模式之空对象模式【EmptyModelLoader】【EmptyList<E>】的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?