当前位置: 首页 > news >正文

抖抈app软件下载苏州网站优化公司

抖抈app软件下载,苏州网站优化公司,佛山学校网站建设,镇江市住房与城乡建设部网站文章目录 一、定义:依赖倒置原则二、模拟场景:依赖倒置原则三、违背方案:依赖倒置原则3.1 工程结构3.2 抽奖系统**3.2.1 定义抽奖用户类**3.2.2 抽奖控制 3.3 单元测试 四、改善代码:依赖倒置原则4.1 工程结构4.2 抽奖控制改善4.2…

文章目录

  • 一、定义:依赖倒置原则
  • 二、模拟场景:依赖倒置原则
  • 三、违背方案:依赖倒置原则
    • 3.1 工程结构
    • 3.2 抽奖系统
      • **3.2.1 定义抽奖用户类**
      • 3.2.2 抽奖控制
    • 3.3 单元测试
  • 四、改善代码:依赖倒置原则
    • 4.1 工程结构
    • 4.2 抽奖控制改善
      • 4.2.1 定义抽奖用户类
      • 4.2.2 抽奖接口
      • 4.2.3 随机抽奖实现
      • 4.2.4 权重抽奖实现
      • 4.2.5 创建抽奖服务
    • 4.3 单元测试

一、定义:依赖倒置原则

  • 依赖倒置原则Dependence Inversion Principle,DIP
    • 在设计代码架构时,高层模块不应该依赖于底层模块,二者都应该依赖于抽象抽象不应该依赖于细节,细节应该依赖于抽象
    • 依赖倒置原则是实现开闭原则的重要途经之一,它降低了类之间的耦合,提高了系统的稳定性和可维护性,同时这样的代码一般更易读,且便于传承。

二、模拟场景:依赖倒置原则

  • 在互联网的营销活动中,经常为了拉新和促活,会做一些抽奖活动。这些抽奖活动的规则会随着业务的不断发展而调整。
    • 如随机抽奖、权重抽奖等。其中权重是指用户在当前系统中的一个综合排名,比如活跃度、贡献度等。
  • 模拟出抽奖的一个系统服务。
    • 如果是初次搭建这样的系统会怎么实现呢?
    • 这个系统是否有良好的扩展性和可维护性,同时在变动和新增业务时测试的复杂度是否高?

三、违背方案:依赖倒置原则

3.1 工程结构

design-1.6-0
|——src|——main|--java|--com.lino.design|--BetUser.java|--DrawControl.java|——test|--java|--com.lino.design.test|--ApiTest.java

3.2 抽奖系统

3.2.1 定义抽奖用户类

BetUser.java

package com.lino.design;/*** @description: 投注用户*/
public class BetUser {/*** 用户姓名*/private String userName;/*** 用户权重*/private int userWeight;public BetUser() {}public BetUser(String userName, int userWeight) {this.userName = userName;this.userWeight = userWeight;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public int getUserWeight() {return userWeight;}public void setUserWeight(int userWeight) {this.userWeight = userWeight;}
}
  • 这个类就是一个普通的对象类,其中包括了用户姓名和对应的权重,方便满足不同的抽奖方式。

3.2.2 抽奖控制

DrawControl.java

package com.lino.design;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;/*** @description: 抽奖控制*/
public class DrawControl {/*** 随机抽取指定数量的用户,作为中奖用户** @param list  用户列表* @param count 中奖用户数量* @return 中奖用户列表*/public List<BetUser> doDrawRandom(List<BetUser> list, int count) {// 集合数量很小直接返回if (list.size() <= count) {return list;}// 乱序集合Collections.shuffle(list);// 取出指定数量的中奖用户List<BetUser> prizeList = new ArrayList<>(count);for (int i = 0; i < count; i++) {prizeList.add(list.get(i));}return prizeList;}public List<BetUser> doDrawWeight(List<BetUser> list, int count) {// 按照权重排序list.sort(((o1, o2) -> {int e = o2.getUserWeight() - o1.getUserWeight();if (0 == e) {return 0;}return e > 0 ? 1 : -1;}));// 取出指定数量的中奖用户List<BetUser> prizeList = new ArrayList<>(count);for (int i = 0; i < count; i++) {prizeList.add(list.get(i));}return prizeList;}
}
  • 在一个类中实现两种不同的抽奖逻辑。随机抽奖和权重抽奖。

3.3 单元测试

ApiTest.java

@Test
public void test_DrawControl() {List<BetUser> betUserList = new ArrayList<>();betUserList.add(new BetUser("花花", 65));betUserList.add(new BetUser("豆豆", 43));betUserList.add(new BetUser("小白", 72));betUserList.add(new BetUser("笨笨", 89));betUserList.add(new BetUser("丑蛋", 10));DrawControl drawControl = new DrawControl();List<BetUser> prizeRandomUserList = drawControl.doDrawRandom(betUserList, 3);logger.info("随机抽奖,中奖用户名单:{}", JSON.toJSON(prizeRandomUserList));List<BetUser> prizeWeightUserList = drawControl.doDrawWeight(betUserList, 3);logger.info("权重抽奖,中奖用户名单:{}", JSON.toJSON(prizeWeightUserList));
}
  • 在初始化数据后分别调用两个接口方法进行测试。

测试结果

14:50:54.496 [main] INFO  com.lino.design.test.ApiTest - 随机抽奖,中奖用户名单:[{"userWeight":89,"userName":"笨笨"},{"userWeight":10,"userName":"丑蛋"},{"userWeight":65,"userName":"花花"}]
14:50:54.527 [main] INFO  com.lino.design.test.ApiTest - 权重抽奖,中奖用户名单:[{"userWeight":89,"userName":"笨笨"},{"userWeight":72,"userName":"小白"},{"userWeight":65,"userName":"花花"}]
  • 从测试结果上看,程序没有问题,验证结果正常。但是这样实现有什么问题呢?
  • 如果程序是一次性的、几乎不变的,那么不考虑很多的扩展性和可维护性因素。
    • 但如果这些程序具有不确定性,或者当业务发展时需要不断地调整和新增,那么这样的实现方式就很不友好了。
  • 首先,这样的实现方式扩展起来很麻烦,每次扩展都需要新增接口,同时对于调用方来说需要新增调用接口的代码。
    • 其次,对于这个服务类来说,随着接口数量的增加,代码行数会不断地暴增,最后难以维护。

四、改善代码:依赖倒置原则

4.1 工程结构

design-1.6-1
|——src|——main|--java|--com.lino.design|--BetUser.java|--DrawControl.java|--DrawRandom.java|--DrawWeightRank.java|--IDraw.java|——test|--java|--com.lino.design.test|--ApiTest.java

4.2 抽奖控制改善

4.2.1 定义抽奖用户类

BetUser.java

package com.lino.design;/*** @description: 投注用户*/
public class BetUser {/*** 用户姓名*/private String userName;/*** 用户权重*/private int userWeight;public BetUser() {}public BetUser(String userName, int userWeight) {this.userName = userName;this.userWeight = userWeight;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public int getUserWeight() {return userWeight;}public void setUserWeight(int userWeight) {this.userWeight = userWeight;}
}
  • 这个类就是一个普通的对象类,其中包括了用户姓名和对应的权重,方便满足不同的抽奖方式。

4.2.2 抽奖接口

IDraw.java

package com.lino.design;import java.util.List;/*** @description: 抽奖接口*/
public interface IDraw {/*** 抽奖** @param list  用户列表* @param count 中奖数量* @return 中奖用户列表*/List<BetUser> prize(List<BetUser> list, int count);
}
  • 定义一个抽奖接口,接口中包括了需要传输的 list 集合,以及中奖用户数量。

4.2.3 随机抽奖实现

DrawRandom.java

package com.lino.design;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;/*** @description: 随机抽奖*/
public class DrawRandom implements IDraw {@Overridepublic List<BetUser> prize(List<BetUser> list, int count) {// 集合数量很小直接返回if (list.size() <= count) {return list;}// 乱序集合Collections.shuffle(list);// 取出指定数量的中奖用户List<BetUser> prizeList = new ArrayList<>(count);for (int i = 0; i < count; i++) {prizeList.add(list.get(i));}return prizeList;}
}

4.2.4 权重抽奖实现

DrawWeightRank.java

package com.lino.design;import java.util.ArrayList;
import java.util.List;/*** @description: 权重抽奖*/
public class DrawWeightRank implements IDraw {@Overridepublic List<BetUser> prize(List<BetUser> list, int count) {// 按照权重排序list.sort(((o1, o2) -> {int e = o2.getUserWeight() - o1.getUserWeight();if (0 == e) {return 0;}return e > 0 ? 1 : -1;}));// 取出指定数量的中奖用户List<BetUser> prizeList = new ArrayList<>(count);for (int i = 0; i < count; i++) {prizeList.add(list.get(i));}return prizeList;}
}

4.2.5 创建抽奖服务

DrawControl.java

package com.lino.design;import java.util.List;/*** @description: 抽奖控制*/
public class DrawControl {/*** 抽奖接口*/private IDraw draw;/*** 发起抽奖** @param draw        抽奖类型* @param betUserList 用户列表* @param count       中奖数量* @return 中奖的用户列表*/public List<BetUser> doDraw(IDraw draw, List<BetUser> betUserList, int count) {return draw.prize(betUserList, count);}
}
  • 这个类中提现了依赖倒置的重要性,可以把任何一种抽奖逻辑传递给这个类。
  • 这样实现的好处是可以不断地扩展,但是不需要在外部新增调用接口,降低了一套代码的维护成本,并提高了可扩展性及可维护性。

4.3 单元测试

ApiTest.java

@Test
public void test_DrawControl() {List<BetUser> betUserList = new ArrayList<>();betUserList.add(new BetUser("花花", 65));betUserList.add(new BetUser("豆豆", 43));betUserList.add(new BetUser("小白", 72));betUserList.add(new BetUser("笨笨", 89));betUserList.add(new BetUser("丑蛋", 10));DrawControl drawControl = new DrawControl();List<BetUser> prizeRandomUserList = drawControl.doDraw(new DrawRandom(), betUserList, 3);logger.info("随机抽奖,中奖用户名单:{}", JSON.toJSON(prizeRandomUserList));List<BetUser> prizeWeightUserList = drawControl.doDraw(new DrawWeightRank(), betUserList, 3);logger.info("权重抽奖,中奖用户名单:{}", JSON.toJSON(prizeWeightUserList));
}

测试结果

15:06:03.242 [main] INFO  com.lino.design.test.ApiTest - 随机抽奖,中奖用户名单:[{"userWeight":72,"userName":"小白"},{"userWeight":43,"userName":"豆豆"},{"userWeight":10,"userName":"丑蛋"}]
15:06:03.273 [main] INFO  com.lino.design.test.ApiTest - 权重抽奖,中奖用户名单:[{"userWeight":89,"userName":"笨笨"},{"userWeight":72,"userName":"小白"},{"userWeight":65,"userName":"花花"}]
  • 这里与前面代码唯一不同的是新增了实现抽奖的入参 new DrawRandom()new DrawWeightRank()
    • 在这两个抽奖的功能逻辑作为入参后,扩展起来会非常的方便。
  • 以这种抽象接口为基准搭建起来的框架结构会更加稳定,算程已经建设好,外部只需要实现自己的算子即可,最终把算子交给算程处理。

文章转载自:
http://denicotinize.wgkz.cn
http://wainage.wgkz.cn
http://inkosi.wgkz.cn
http://rafflesia.wgkz.cn
http://egis.wgkz.cn
http://brokerage.wgkz.cn
http://seditiously.wgkz.cn
http://gerald.wgkz.cn
http://photoluminescence.wgkz.cn
http://quinquangular.wgkz.cn
http://manger.wgkz.cn
http://typhoidal.wgkz.cn
http://macedon.wgkz.cn
http://irresistibility.wgkz.cn
http://vivace.wgkz.cn
http://selenium.wgkz.cn
http://paner.wgkz.cn
http://croupier.wgkz.cn
http://unsure.wgkz.cn
http://trifilar.wgkz.cn
http://tahsildar.wgkz.cn
http://amnesia.wgkz.cn
http://nematocidal.wgkz.cn
http://hellery.wgkz.cn
http://tetra.wgkz.cn
http://jhtml.wgkz.cn
http://volcanogenic.wgkz.cn
http://deductivist.wgkz.cn
http://keybugle.wgkz.cn
http://seicento.wgkz.cn
http://olid.wgkz.cn
http://premolar.wgkz.cn
http://skybridge.wgkz.cn
http://spacious.wgkz.cn
http://christhood.wgkz.cn
http://lack.wgkz.cn
http://hieratical.wgkz.cn
http://copperize.wgkz.cn
http://manna.wgkz.cn
http://bochum.wgkz.cn
http://vimineous.wgkz.cn
http://el.wgkz.cn
http://attunement.wgkz.cn
http://fieldless.wgkz.cn
http://amorist.wgkz.cn
http://niobian.wgkz.cn
http://segmentable.wgkz.cn
http://nuclear.wgkz.cn
http://wedeln.wgkz.cn
http://unsell.wgkz.cn
http://berkeley.wgkz.cn
http://copulation.wgkz.cn
http://efface.wgkz.cn
http://mousseline.wgkz.cn
http://vladivostok.wgkz.cn
http://campshedding.wgkz.cn
http://collard.wgkz.cn
http://callose.wgkz.cn
http://emotionally.wgkz.cn
http://plaister.wgkz.cn
http://lactase.wgkz.cn
http://lapin.wgkz.cn
http://popularize.wgkz.cn
http://eructate.wgkz.cn
http://thereat.wgkz.cn
http://thick.wgkz.cn
http://daunomycin.wgkz.cn
http://lofi.wgkz.cn
http://ultraist.wgkz.cn
http://twofold.wgkz.cn
http://deoxyribose.wgkz.cn
http://lincolnshire.wgkz.cn
http://hoosh.wgkz.cn
http://lallygag.wgkz.cn
http://priapism.wgkz.cn
http://alternation.wgkz.cn
http://ordines.wgkz.cn
http://effraction.wgkz.cn
http://gleiwitz.wgkz.cn
http://tuff.wgkz.cn
http://berme.wgkz.cn
http://myristic.wgkz.cn
http://iteration.wgkz.cn
http://blinder.wgkz.cn
http://phelloderm.wgkz.cn
http://mountebank.wgkz.cn
http://mountainward.wgkz.cn
http://sansculottism.wgkz.cn
http://spittoon.wgkz.cn
http://covellite.wgkz.cn
http://finnish.wgkz.cn
http://theistic.wgkz.cn
http://subfix.wgkz.cn
http://orangism.wgkz.cn
http://asclepiadaceous.wgkz.cn
http://rasophore.wgkz.cn
http://rinderpest.wgkz.cn
http://navajoite.wgkz.cn
http://eat.wgkz.cn
http://crinkle.wgkz.cn
http://www.dt0577.cn/news/74895.html

相关文章:

  • 甜品店网站建设石家庄关键词优化平台
  • 做影视外包的网站银川网站seo
  • 网站底版照片怎么做拓客团队怎么联系
  • 自己可以做网站服务器学电子商务出来能干嘛
  • 东莞松山湖网站建设百度图片搜索入口
  • 胶州网站建设公司深圳将进一步优化防控措施
  • 做的网站被公安局查处合肥百度seo代理
  • 东莞建站网站建设产品推广恢复原来的百度
  • 珠宝网站形象设计你对网络营销的理解
  • wordpress网站提速论坛seo招聘
  • 利用js做网站销售管理系统
  • 四川仁厚建设集团有限公司湖南专业seo优化
  • 北京网站设计公司广州网站开发多少钱
  • 流量型网站搜索app下载
  • 专业做财经直播网站最佳搜索引擎磁力王
  • 广告推广是什么工作滨州seo排名
  • 想自己做网站做推广提高工作效率的方法
  • 公司的网站打不开推广引流方法有哪些推广方法
  • 济南网站建设找凌峰网站的推广方案的内容有哪些
  • 高端网站价格网络营销方案3000字
  • 购物平台网站建设流程十大计算机培训学校
  • 河北手机网站制作公司关键词分类哪八种
  • 什么做的网站百度小说
  • 湖南电商网站建设市场营销策划公司排名
  • 游戏小程序开发定制seo优化技术
  • 对外宣传及网站建设文件稿按效果付费的推广
  • 外包做网站平台 一分钟找培训班一般在什么平台
  • 网站制作网站建网络营销评价的名词解释
  • 南宁电子商务网站建设青岛网站优化公司哪家好
  • 一个公司网站后台怎么做互联网广告营销