前言
原型設(shè)計(jì)模式系列文章
原型設(shè)計(jì)模式(一) - 定義续崖、訂單拆分
原型設(shè)計(jì)模式(二) - 訂單拆分一般寫法實(shí)現(xiàn)
原型設(shè)計(jì)模式(三) - 訂單拆分采用原型設(shè)計(jì)模式進(jìn)行改進(jìn)
原型設(shè)計(jì)模式(四) - 訂單拆分采用系統(tǒng)自帶的拷貝的方法實(shí)現(xiàn)
原型設(shè)計(jì)模式(五) - 淺拷貝
原型設(shè)計(jì)模式(六) - 深拷貝
原型設(shè)計(jì)模式(七) - 使用場(chǎng)景
1. 使用場(chǎng)景
1>:Intent:不用在每個(gè)Activity中使用intent攜帶參數(shù)谤职,而跳轉(zhuǎn)到下一個(gè)Activity,直接調(diào)用clone()方法返回intent對(duì)象递胧;
2>:ArrayList:把后臺(tái)返回的ArrayList集合數(shù)據(jù)烙心,調(diào)用clone方法直接轉(zhuǎn)為copyList胜宇,不用重新定義新的集合來添加后臺(tái)返回的list集合袱结;
注意這里是ArrayList迂卢,而不是List某弦;
3>:OkHttp;
2. 具體介紹
1>:Intent中的使用:
比如我們開發(fā)中有時(shí)候會(huì)有這樣的需求:
a:從Activity1跳轉(zhuǎn)到Activity2并且攜帶3個(gè)參數(shù)而克;
b:然后在Activity2中取出3個(gè)參數(shù)后靶壮,然后再跳轉(zhuǎn)到Activity3,并且把這3個(gè)參數(shù)攜帶過去员萍;
如下圖所示:
我們一般寫法就是:
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()取出數(shù)據(jù),然后再new Intent()跳轉(zhuǎn)到Activity3中碎绎,并攜帶取出的參數(shù)螃壤;
public class Activity2 extends AppCompatActivity {
private List<String> newList = new ArrayList<>() ;
private List<String> newList2 = new ArrayList<>() ;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 一個(gè)參數(shù)一個(gè)參數(shù)的獲取
String Params1 = getIntent().getStringExtra("Params1") ;
String Params2 = getIntent().getStringExtra("Params2") ;
String Params3 = getIntent().getStringExtra("Params3") ;
// 再new一個(gè)intent 抗果,然后再把參數(shù)傳遞到 Activity3
Intent intent = new Intent(this , Activity3.class) ;
intent.putExtra("Params1" , "Params1") ;
intent.putExtra("Params2" , "Params2") ;
intent.putExtra("Params3" , "Params3") ;
startActivity(intent);
}
}
這個(gè)是一般寫法,有點(diǎn)麻煩映穗,這里可以采用原型設(shè)計(jì)模式窖张,直接調(diào)用intent.clone()方法,獲取一個(gè) intent對(duì)象蚁滋,然后跳轉(zhuǎn)到Activity3宿接,然后在Activity3中取出數(shù)據(jù)即可,代碼如下:
public class Activity2 extends AppCompatActivity {
private List<String> newList = new ArrayList<>() ;
private List<String> newList2 = new ArrayList<>() ;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 一個(gè)參數(shù)一個(gè)參數(shù)的獲取
/*String Params1 = getIntent().getStringExtra("Params1") ;
String Params2 = getIntent().getStringExtra("Params2") ;
String Params3 = getIntent().getStringExtra("Params3") ;
// 再new一個(gè)intent 辕录,然后再把參數(shù)傳遞到 Activity3
Intent intent = new Intent(this , Activity3.class) ;
intent.putExtra("Params1" , "Params1") ;
intent.putExtra("Params2" , "Params2") ;
intent.putExtra("Params3" , "Params3") ;
startActivity(intent);*/
// 使用場(chǎng)景1:采用原型設(shè)計(jì)模式(拷貝)
Intent intent = (Intent) getIntent().clone();
intent.setClass(this , Activity3.class) ;
startActivity(intent);
}
}
d:然后在Activity3中取出數(shù)據(jù)即可睦霎;
public class Activity3 extends AppCompatActivity {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 取出數(shù)據(jù)
String Params1 = getIntent().getStringExtra("Params1") ;
String Params2 = getIntent().getStringExtra("Params2") ;
String Params3 = getIntent().getStringExtra("Params3") ;
}
}
2>:ArrayList中的使用:
在開發(fā)過程中,一般我們從后臺(tái)獲取到的數(shù)據(jù)是一個(gè)List或者ArrayList集合走诞,而我們一般都需要重新定義一個(gè)newList集合副女,用來把返回的list集合添加到newList集合中,常用的做法一般有2種:
a:在最外層定義一個(gè)newList蚣旱,然后for循環(huán)遍歷這個(gè)后臺(tái)返回的list集合碑幅,獲取到每一個(gè)元素,然后調(diào)用add()方法塞绿,把每個(gè)元素添加到newList集合中沟涨;
b:在最外層定義一個(gè)newList2,直接調(diào)用addAll(list)异吻,把list集合添加到newList2中就可以了裹赴;
c:還有一種就是可以采用原型設(shè)計(jì)模式(拷貝)的方法,直接調(diào)用list.clone()方法诀浪,返回一個(gè)ArrayList棋返,就直接復(fù)制出一個(gè)新的 ArrayList集合,就不需要我們自己重新在最外層定義newList集合了雷猪,比較方便睛竣,代碼如下:
public class Activity2 extends AppCompatActivity {
private List<String> newList = new ArrayList<>() ;
private List<String> newList2 = new ArrayList<>() ;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 使用場(chǎng)景2:比如從后臺(tái)獲取到了一個(gè)list集合,現(xiàn)在需要把這個(gè)list集合的數(shù)據(jù)放到另一個(gè)list集合求摇,常用的有2種方法:
ArrayList<String> list = new ArrayList<>() ;
// 方法1:在外層定義一個(gè)集合newList酵颁,然后用for循環(huán),遍歷list集合月帝,把取出的數(shù)據(jù)放入newList中
for (String s : list) {
newList.add(s) ;
}
// 方法2:在外層定義一個(gè)集合newList2,直接把這個(gè)list集合進(jìn)行addAll()幽污,添加到newList2中嚷辅,就可以了;
newList2.addAll(list) ;
// 方法3:采用原型設(shè)計(jì)模式(拷貝)的方法距误,這樣就獲取到了一個(gè)新的集合
ArrayList<String> copyList = (ArrayList<String>) list.clone();
}
}
3>:OkHttp源碼中的使用:
OkHttp的源碼簸搞,沒用系統(tǒng)的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()也用到了原型設(shè)計(jì)模式趁俊,這個(gè)是淺拷貝域仇;
代碼已上傳至github:
https://github.com/shuai999/Architect_day17.git