前言
原型设计模式系列文章
原型设计模式(一) - 定义、订单拆分
原型设计模式(二) - 订单拆分一般写法实现
原型设计模式(三) - 订单拆分采用原型设计模式进行改进
原型设计模式(四) - 订单拆分采用系统自带的拷贝的方法实现
原型设计模式(五) - 浅拷贝
原型设计模式(六) - 深拷贝
原型设计模式(七) - 使用场景
1. 使用场景
1>:Intent:不用在每个Activity中使用intent携带参数,而跳转到下一个Activity,直接调用clone()方法返回intent对象;
2>:ArrayList:把后台返回的ArrayList集合数据,调用clone方法直接转为copyList,不用重新定义新的集合来添加后台返回的list集合;
注意这里是ArrayList,而不是List;
3>:OkHttp;
2. 具体介绍
1>:Intent中的使用:
比如我们开发中有时候会有这样的需求:
a:从Activity1跳转到Activity2并且携带3个参数;
b:然后在Activity2中取出3个参数后,然后再跳转到Activity3,并且把这3个参数携带过去;
如下图所示:
我们一般写法就是:
a:在Activity1中写:
public class Activity1 extends AppCompatActivity {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this , Activity2.class) ;
intent.putExtra("Params1" , "Params1") ;
intent.putExtra("Params2" , "Params2") ;
intent.putExtra("Params3" , "Params3") ;
startActivity(intent);
}
}
b:然后在Activity2中,通过getIntent().getStringExtra()取出数据,然后再new Intent()跳转到Activity3中,并携带取出的参数;
public class Activity2 extends AppCompatActivity {
private List newList = new ArrayList<>() ;
private List newList2 = new ArrayList<>() ;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 一个参数一个参数的获取
String Params1 = getIntent().getStringExtra("Params1") ;
String Params2 = getIntent().getStringExtra("Params2") ;
String Params3 = getIntent().getStringExtra("Params3") ;
// 再new一个intent ,然后再把参数传递到 Activity3
Intent intent = new Intent(this , Activity3.class) ;
intent.putExtra("Params1" , "Params1") ;
intent.putExtra("Params2" , "Params2") ;
intent.putExtra("Params3" , "Params3") ;
startActivity(intent);
}
}
这个是一般写法,有点麻烦,这里可以采用原型设计模式,直接调用intent.clone()方法,获取一个 intent对象,然后跳转到Activity3,然后在Activity3中取出数据即可,代码如下:
public class Activity2 extends AppCompatActivity {
private List newList = new ArrayList<>() ;
private List newList2 = new ArrayList<>() ;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 一个参数一个参数的获取
/*String Params1 = getIntent().getStringExtra("Params1") ;
String Params2 = getIntent().getStringExtra("Params2") ;
String Params3 = getIntent().getStringExtra("Params3") ;
// 再new一个intent ,然后再把参数传递到 Activity3
Intent intent = new Intent(this , Activity3.class) ;
intent.putExtra("Params1" , "Params1") ;
intent.putExtra("Params2" , "Params2") ;
intent.putExtra("Params3" , "Params3") ;
startActivity(intent);*/
// 使用场景1:采用原型设计模式(拷贝)
Intent intent = (Intent) getIntent().clone();
intent.setClass(this , Activity3.class) ;
startActivity(intent);
}
}
d:然后在Activity3中取出数据即可;
public class Activity3 extends AppCompatActivity {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 取出数据
String Params1 = getIntent().getStringExtra("Params1") ;
String Params2 = getIntent().getStringExtra("Params2") ;
String Params3 = getIntent().getStringExtra("Params3") ;
}
}
2>:ArrayList中的使用:
在开发过程中,一般我们从后台获取到的数据是一个List或者ArrayList集合,而我们一般都需要重新定义一个newList集合,用来把返回的list集合添加到newList集合中,常用的做法一般有2种:
a:在最外层定义一个newList,然后for循环遍历这个后台返回的list集合,获取到每一个元素,然后调用add()方法,把每个元素添加到newList集合中;
b:在最外层定义一个newList2,直接调用addAll(list),把list集合添加到newList2中就可以了;
c:还有一种就是可以采用原型设计模式(拷贝)的方法,直接调用list.clone()方法,返回一个ArrayList,就直接复制出一个新的 ArrayList集合,就不需要我们自己重新在最外层定义newList集合了,比较方便,代码如下:
public class Activity2 extends AppCompatActivity {
private List newList = new ArrayList<>() ;
private List newList2 = new ArrayList<>() ;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 使用场景2:比如从后台获取到了一个list集合,现在需要把这个list集合的数据放到另一个list集合,常用的有2种方法:
ArrayList list = new ArrayList<>() ;
// 方法1:在外层定义一个集合newList,然后用for循环,遍历list集合,把取出的数据放入newList中
for (String s : list) {
newList.add(s) ;
}
// 方法2:在外层定义一个集合newList2,直接把这个list集合进行addAll(),添加到newList2中,就可以了;
newList2.addAll(list) ;
// 方法3:采用原型设计模式(拷贝)的方法,这样就获取到了一个新的集合
ArrayList copyList = (ArrayList) list.clone();
}
}
3>:OkHttp源码中的使用:
OkHttp的源码,没用系统的clone(),但是是类似的,部分源码如下:
a:自己写的:
public class Activity2 extends AppCompatActivity {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
OkHttpClient client = new OkHttpClient() ;
client.newBuilder() ;
}
}
b:newBuilder()中源码:
public Builder newBuilder() {
return new Builder(this);
}
c: Builder()源码如下:
Builder(OkHttpClient okHttpClient) {
this.dispatcher = okHttpClient.dispatcher;
this.proxy = okHttpClient.proxy;
this.protocols = okHttpClient.protocols;
this.connectionSpecs = okHttpClient.connectionSpecs;
this.interceptors.addAll(okHttpClient.interceptors);
this.networkInterceptors.addAll(okHttpClient.networkInterceptors);
this.eventListenerFactory = okHttpClient.eventListenerFactory;
this.proxySelector = okHttpClient.proxySelector;
this.cookieJar = okHttpClient.cookieJar;
this.internalCache = okHttpClient.internalCache;
this.cache = okHttpClient.cache;
this.socketFactory = okHttpClient.socketFactory;
this.sslSocketFactory = okHttpClient.sslSocketFactory;
this.certificateChainCleaner = okHttpClient.certificateChainCleaner;
this.hostnameVerifier = okHttpClient.hostnameVerifier;
this.certificatePinner = okHttpClient.certificatePinner;
this.proxyAuthenticator = okHttpClient.proxyAuthenticator;
this.authenticator = okHttpClient.authenticator;
this.connectionPool = okHttpClient.connectionPool;
this.dns = okHttpClient.dns;
this.followSslRedirects = okHttpClient.followSslRedirects;
this.followRedirects = okHttpClient.followRedirects;
this.retryOnConnectionFailure = okHttpClient.retryOnConnectionFailure;
this.connectTimeout = okHttpClient.connectTimeout;
this.readTimeout = okHttpClient.readTimeout;
this.writeTimeout = okHttpClient.writeTimeout;
this.pingInterval = okHttpClient.pingInterval;
}
所以说OkHttpClient中的 newBuilder()也用到了原型设计模式,这个是浅拷贝;
代码已上传至github:
https://github.com/shuai999/Architect_day17.git