原型设计模式(七) - 使用场景

前言

原型设计模式系列文章
原型设计模式(一) - 定义、订单拆分
原型设计模式(二) - 订单拆分一般写法实现
原型设计模式(三) - 订单拆分采用原型设计模式进行改进
原型设计模式(四) - 订单拆分采用系统自带的拷贝的方法实现
原型设计模式(五) - 浅拷贝
原型设计模式(六) - 深拷贝
原型设计模式(七) - 使用场景

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个参数携带过去;
如下图所示:


原型设计模式(七) - 使用场景_第1张图片
3个Activity携带参数连续跳转.png

我们一般写法就是:
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

你可能感兴趣的:(原型设计模式(七) - 使用场景)