盒子
盒子
文章目录
  1. 1. Bulider模式的定义
  2. 2. Bulider模式的实现
    1. 代码
  3. 总结

Android 设计模式:(三)Builder模式

前言
本文是对《Adroid 源码设计模式解析与实战》 何红辉、关爱民 著 人民邮电出版社所做的读书笔记。文章是对本书的一些列学习笔记,如若有侵犯到作者权益,还望作者能联系我,我会及时下架。
这本书不错,有兴趣的同学可以买原书看看。
感兴趣的朋友欢迎加入学习小组QQ群: 193765960

版权归作者所有,如有转发,请注明文章出处:https://xiaodanchen.github.io/archives/

1. Bulider模式的定义

将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。对于一个复杂的对象,为了在构建过程中对外部隐藏实现细节或者想要对对象的内部组件根据需要实现灵活的配置,就可以使用Builder模式将部件和组装过程分离,使得构建过程和部件都可以自由扩展,两者之间的耦合也降到最低。
通常会将Builder设计为链式调用,他的关键点是每个setter方法都返回自身,也就是return this,这样就使得setter方法可以链式调用。通过这种形式,使得整个结构更加简单,也能对复杂类对象的组装过程实现更精细化的控制。

2. Bulider模式的实现

下面我将以我们在之前的文章《Android 设计模式:(一)面向对象的六大原则》中作为示例的ImageLoader为例来举例。

代码

简单点,假设我们要求ImageLoader可以设置缓存策略,设置加载中占位图,设置加载失败背景图,这是加载资源URI,设置ImageView和加载成功失败的回调监听器这几个常见的设置。
那么,框架大体如下:
2.1 定义缓存策略接口

1
2
3
4
5
6
7
/**
* 缓存策略接口类
*/
public interface ImageCache{
public Bitmap get(String url);
public void put(String url, Bitmap bmp);
}

2.2 定义一个属性设置辅助类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 属性设置辅助类:
* 偷个懒,就不写成setter和getter形式的了
*/
public class ImageLoaderController{
//加载中占位图
public int loadingPlaceHolder;
//加载失败背景图
public int loadfailedPlaceHolder;
//加载资源URI
public String uri;
//ImageView
public View target;
}

2.3 定义加载状态回调接口

1
2
3
4
5
6
7
8
/**
* 缓存策略接口类
*/
public interface LoadListener{
void onLoading();
void onLoadFailed();
void onLoadSucceed();
}

2.4 实现ImageLoader类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/**
* ImageLoader类:
*/
public class ImageLoader{
//加载策略
private ImageCache mImageCache;
//加载失败背景图
private ImageLoaderController mController;
//加载状态监听器
public LoadListener mLoadListener;
private ImageLoader(){
mController = new ImageLoaderController();
}
//执行请求
private void load(){
//发起加载请求,根据加载策略加载资源等
...
}
public static class Builder{
private ImageLoader mImageLoader;
public Builder(){
mImageLoader = new ImageLoader();
}
public Builder setLoadingPlaceHolder(int resId){
mImageLoader.mController.loadingPlaceHolder = resId;
return this;
}
public Builder setLoadfailedPlaceHolder(int resId){
mImageLoader.mController.loadfailedPlaceHolder = resId;
return this;
}
public Builder seUri(String uri){
mImageLoader.mController.uri = uri;
return this;
}
public Builder setTarget(View target){
mImageLoader.mController.target = target;
return this;
}
public Builder setCache(ImageCache cache){
mImageLoader.mImageCache = cache;
return this;
}
public Builder setLoadListener(LoadListener listener){
mImageLoader.mLoadListener = listener;
return this;
}
public ImageLoader build(){
mImageLoader.load();
return mImageLoader;
}
}
}

用户使用

1
2
3
4
5
6
7
8
ImageLoader.Builder builder = ImageLoader.Builder();
builder.setLoadingPlaceHolder(R.drawable.iv_loading)
.setLoadfailedPlaceHolder(R.drawable.iv_loadfailed)
.seUri(url)
.setTarget(imageview)
.setCache(mDoubleCache)
.setLoadListener(mLoadListener)
.build();

总结

本文所写的实例代码可能不太实用,但是仅仅是为了说明一下Builder模式。
Bulider模式:

  • 配置灵活:开发者不需要设计一系列的构造函数来满足各种各样的需求
  • 利于扩展:假如我们的类需要扩展属性(能力),只需要增加属性和配置函数。符合开闭原则
  • 基本不用修改老的代码:符合开闭原则
扫描加群
好好学习,天天向上!