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

前言

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

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


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<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);


        // 一个参数一个参数的获取
        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<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);


        // 一个参数一个参数的获取
        /*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<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);

        // 使用场景2:比如从后台获取到了一个list集合,现在需要把这个list集合的数据放到另一个list集合,常用的有2种方法:
        ArrayList<String> 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<String> copyList = (ArrayList<String>) 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容

  • 对于开发人员来说,设计模式有时候就是一道坎,但是设计模式又非常有用,过了这道坎,它可以让你水平提高一个档次。而在a...
    WANKUN阅读 260评论 0 2
  • 本文首发于个人博客:Lam's Blog - 谈谈23种设计模式在Android源码及项目中的应用,文章由Mark...
    格子林ll阅读 4,647评论 1 105
  • 定义 原型模式是一个创建型的设计模式。用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。原型模式多用于...
    忘尘无憾阅读 528评论 0 0
  • 《金刚经说什么》D02:6:30-7;20p33-p61第二品 善现启请分 金刚经里蕴含着大智慧,短短的几句...
    山妮1226阅读 213评论 0 0
  • 做了一个梦把自己吓醒了 高二下学期测试考 很糟决定复读 黑板上老师写写划划 下面埋头解题 忽然抬头看到黑板旁 大大...
    Sunny37笛乐阅读 208评论 0 1