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

新县住房和城乡规划建设局网站网站分析百度 代码

新县住房和城乡规划建设局网站,网站分析百度 代码,专业提供网站建设服务包括,php网站开发模板自我审视记录本这篇博客文章希望展示另一种方法#xff0c;该方法如何通过依赖注入实现策略模式。 作为DI框架#xff0c;我选择Spring框架 首先#xff0c;让我们看一下如何以经典方式实施策略模式。 作为起点#xff0c;我们有一个HeroController #xff0c;应该在He… 自我审视记录本 这篇博客文章希望展示另一种方法该方法如何通过依赖注入实现策略模式。 作为DI框架我选择Spring框架 首先让我们看一下如何以经典方式实施策略模式。 作为起点我们有一个HeroController 应该在HeroRepository添加英雄 HeroRepository取决于用户选择的存储库。 package com.github.sparsick.springbootexample.hero.universum; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; Controller public class HeroControllerClassicWay { PostMapping ( /hero/new ) public String addNewHero( ModelAttribute ( newHero ) NewHeroModel newHeroModel) { HeroRepository heroRepository findHeroRepository(newHeroModel.getRepository()); heroRepository.addHero(newHeroModel.getHero()); return redirect:/hero ; } private HeroRepository findHeroRepository(String repositoryName) { if (repositoryName.equals( Unique )) { return new UniqueHeroRepository(); } if (repositoryName.equals(( Duplicate )){ return new DuplicateHeroRepository(); } throw new IllegalArgumentException(String.format( Find no repository for given repository name [%s] , repositoryName)); } } package com.github.sparsick.springbootexample.hero.universum; import java.util.Collection; import java.util.HashSet; import java.util.Set; import org.springframework.stereotype.Repository; Repository public class UniqueHeroRepository implements HeroRepository { private SetHero heroes new HashSet(); Override public String getName() { return Unique ; } Override public void addHero(Hero hero) { heroes.add(hero); } Override public CollectionHero allHeros() { return new HashSet(heroes); } } package com.github.sparsick.springbootexample.hero.universum; import org.springframework.stereotype.Repository; import java.util.ArrayList; import java.util.Collection; import java.util.List; Repository public class DuplicateHeroRepository implements HeroRepository { private ListHero heroes new ArrayList(); Override public void addHero(Hero hero) { heroes.add(hero); } Override public CollectionHero allHeros() { return List.copyOf(heroes); } Override public String getName() { return Duplicate ; } } 此实现有一些陷阱。 存储库实现的创建不受Spring Context的管理它打破了依赖注入/控制逆向。 一旦您想使用需要注入其他类的其他功能扩展存储库实现这将很痛苦例如使用MeterRegistry计算此类的使用情况。 package com.github.sparsick.springbootexample.hero.universum; import java.util.Collection; import java.util.HashSet; import java.util.Set; import io.micrometer.core.instrument.Counter; import io.micrometer.core.instrument.MeterRegistry; import org.springframework.stereotype.Repository; Repository public class UniqueHeroRepository implements HeroRepository { private SetHero heroes new HashSet(); private Counter addCounter; public UniqueHeroRepository(MeterRegistry meterRegistry) { addCounter meterRegistry.counter( hero.repository.unique ); } Override public String getName() { return Unique ; } Override public void addHero(Hero hero) { addCounter.increment(); heroes.add(hero); } Override public CollectionHero allHeros() { return new HashSet(heroes); } } 这也打破了关注的分离。 当我想测试控制器类时我不可能轻松地模拟存储库接口。 因此第一个想法是将存储库实现的创建置于Spring上下文中。 库实现使用Repository批注进行批注。 因此Spring的组件扫描找到了它们。 接下来的问题是如何将它们注入控制器类。 在这里Spring功能可以提供帮助。 我在控制器中定义了HeroRepository的列表。 在创建控制器实例的过程中必须填写此列表。 package com.github.sparsick.springbootexample.hero.universum; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import java.util.List; Controller public class HeroControllerRefactoringStep1 { private ListHeroRepository heroRepositories; public HeroControllerRefactoringStep1(ListHeroRepository heroRepositories) { this .heroRepositories heroRepositories; } PostMapping ( /hero/new ) public String addNewHero( ModelAttribute ( newHero ) NewHeroModel newHeroModel) { HeroRepository heroRepository findHeroRepository(newHeroModel.getRepository()); heroRepository.addHero(newHeroModel.getHero()); return redirect:/hero ; } private HeroRepository findHeroRepository(String repositoryName) { return heroRepositories.stream() .filter(heroRepository - heroRepository.getName().equals(repositoryName)) .findFirst() .orElseThrow(()- new IllegalArgumentException(String.format( Find no repository for given repository name [%s] , repositoryName))); Find no repository for given repository name [%s] , repositoryName))); } } Spring在其上下文中搜索HeroRepostiory接口的所有实现并将它们全部放入列表中。 该解决方案的一个缺点是每个添加了英雄的人都会浏览HeroRepository列表以找到正确的实现。 可以通过在控制器构造函数中创建一个以存储库名称为键对应的实现为值的映射来优化此映射。 package com.github.sparsick.springbootexample.hero.universum; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import java.util.HashMap; import java.util.List; import java.util.Map; Controller public class HeroControllerRefactoringStep2 { private MapString, HeroRepository heroRepositories; public HeroControllerRefactoringStep2(ListHeroRepository heroRepositories) { this .heroRepositories heroRepositoryStrategies(heroRepositories); } private MapString, HeroRepository heroRepositoryStrategies(ListHeroRepository heroRepositories){ MapString, HeroRepository heroRepositoryStrategies new HashMap(); heroRepositories.forEach(heroRepository - heroRepositoryStrategies.put(heroRepository.getName(), heroRepository)); return heroRepositoryStrategies; } PostMapping ( /hero/new ) public String addNewHero( ModelAttribute ( newHero ) NewHeroModel newHeroModel) { HeroRepository heroRepository findHeroRepository(newHeroModel.getRepository()); heroRepository.addHero(newHeroModel.getHero()); return redirect:/hero ; } private HeroRepository findHeroRepository(String repositoryName) { HeroRepository heroRepository heroRepositories.get(repositoryName); if (heroRepository ! null ) { return heroRepository; } throw new IllegalArgumentException(String.format( Find no repository for given repository name [%s] , repositoryName)); } } 最后一个问题是应用程序中的其他类是否需要在运行时选择存储库实现的可能性。 我可以将私有方法复制并粘贴到每个有此需求的类中或者将地图的创建移至Spring Context并将Map注入每个类。 package com.github.sparsick.springbootexample.hero; import com.github.sparsick.springbootexample.hero.universum.HeroRepository; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import java.util.HashMap; import java.util.List; import java.util.Map; SpringBootApplication public class HeroApplicationRefactoringStep3 { public static void main(String[] args) { SpringApplication.run(HeroApplication. class , args); } Bean MapString, HeroRepository heroRepositoryStrategy(ListHeroRepository heroRepositories){ MapString, HeroRepository heroRepositoryStrategy new HashMap(); heroRepositories.forEach(heroRepository - heroRepositoryStrategy.put(heroRepository.getName(), heroRepository)); return heroRepositoryStrategy; } } package com.github.sparsick.springbootexample.hero.universum; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import java.util.Map; Controller public class HeroControllerRefactoringStep3 { private MapString, HeroRepository heroRepositoryStrategy; public HeroControllerRefactoringStep3(MapString, HeroRepository heroRepositoryStrategy) { this .heroRepositoryStrategy heroRepositoryStrategy; } PostMapping ( /hero/new ) public String addNewHero( ModelAttribute ( newHero ) NewHeroModel newHeroModel) { HeroRepository heroRepository findHeroRepository(newHeroModel.getRepository()); heroRepository.addHero(newHeroModel.getHero()); return redirect:/hero ; } private HeroRepository findHeroRepository(String repositoryName) { return heroRepositoryStrategy.get(repositoryName); } } 这个解决方案有点丑陋因为使用策略模式并不明显。 因此下一个重构步骤是将英雄存储库地图移至自己的组件类。 因此可以删除应用程序配置中的bean定义heroRepositoryStrategy 。 package com.github.sparsick.springbootexample.hero.universum; import org.springframework.stereotype.Component; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Set; Component public class HeroRepositoryStrategy { private MapString, HeroRepository heroRepositoryStrategies; public HeroRepositoryStrategy(SetHeroRepository heroRepositories) { heroRepositoryStrategies createStrategies(heroRepositories); } HeroRepository findHeroRepository(String repositoryName) { return heroRepositoryStrategies.get(repositoryName); } SetString findAllHeroRepositoryStrategyNames () { return heroRepositoryStrategies.keySet(); } CollectionHeroRepository findAllHeroRepositories(){ return heroRepositoryStrategies.values(); } private MapString, HeroRepository createStrategies(SetHeroRepository heroRepositories){ MapString, HeroRepository heroRepositoryStrategies new HashMap(); heroRepositories.forEach(heroRepository - heroRepositoryStrategies.put(heroRepository.getName(), heroRepository)); return heroRepositoryStrategies; } } package com.github.sparsick.springbootexample.hero.universum; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import java.net.Inet4Address; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import java.util.Map; Controller public class HeroController { private HeroRepositoryStrategy heroRepositoryStrategy; public HeroController(HeroRepositoryStrategy heroRepositoryStrategy) { this .heroRepositoryStrategy heroRepositoryStrategy; } PostMapping ( /hero/new ) public String addNewHero( ModelAttribute ( newHero ) NewHeroModel newHeroModel) { HeroRepository heroRepository heroRepositoryStrategy.findHeroRepository(newHeroModel.getRepository()); heroRepository.addHero(newHeroModel.getHero()); return redirect:/hero ; } } 整个示例托管在GitHub上 。 翻译自: https://www.javacodegeeks.com/2019/09/strategy-pattern-revisited-spring.html自我审视记录本
http://www.zqtcl.cn/news/303095/

相关文章:

  • 如何让自己做的网站可以播放歌曲做培训网站
  • 做网站的毕业设计网站没备案怎么做淘宝客
  • 百度申诉网站建设银行住房租赁代表品牌是什么
  • 网站初期推广方案虚拟服务器搭建wordpress
  • jeecms可以做网站卖吗山西网络推广专业
  • 2017 如何做网站优化育儿哪个网站做的好
  • 网站制作容易吗青岛网站建设公司报价
  • 淘宝建设网站的好处网站制作结构
  • 网站开发网站建设公司临沂网站建设找谁
  • 咋么做网站在电脑上潍坊免费模板建站
  • 苏州网站建设推广咨询平台做网站的公司图
  • 北京企业网站怎么建设免费给我推广
  • 网站制作价钱多少专业的咨询行业网站制作
  • 做百度网站每年的费用多少交换友情链接时需要注意的事项
  • 怎么在百度网站上做自己的网站百度开户渠道
  • php技术的网站建设实录方案做二手手机的网站有哪些
  • 做网站店铺装修的软件怎么做淘课网站
  • 百度一下官方网站wordpress连接代码
  • 什么网站详情页做的好仿唧唧帝笑话门户网站源码带多条采集规则 织梦搞笑图片视频模板
  • 平原网站建设费用少儿编程加盟店倒闭
  • 企业网站建设专业公司蜜淘app在那个网站做的
  • 市住房城乡建设部网站大学生课程设计网站
  • 广州大石附近做网站的公司外包服务公司是干什么的
  • 做的新网站网上搜不到做的网站百度搜索不出来的
  • 电商网站后台报价公司如何建站
  • 查网站有没有做推广企业网站建设的目标
  • 北京网站维护公司专业外贸网站建设_诚信_青岛
  • 网站自己做还是用程序制作网站一般使用的软件有哪些
  • 晨雷文化传媒网站建设济南互联网品牌设计
  • 怎样给自己的网站做防红连接梵客装饰公司官网