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

做网站文字怎么围绕图片万界随机购物系统

做网站文字怎么围绕图片,万界随机购物系统,客户关系管理的含义,dw外部网站链接怎么做这篇博客文章希望展示另一种方法#xff0c;该方法如何通过依赖注入实现策略模式。 作为DI框架#xff0c;我选择Spring框架 首先#xff0c;让我们看一下如何以经典方式实施策略模式。 作为起点#xff0c;我们有一个HeroController #xff0c;应该在HeroRepository添… 这篇博客文章希望展示另一种方法该方法如何通过依赖注入实现策略模式。 作为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)); 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计算该类的使用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)); 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/231761/

相关文章:

  • 深圳大型网站建设服务公司wordpress后台为什么这么慢
  • 信用网站建设工作简报青岛的建筑公司
  • 网站怎么做文件上传灯饰 东莞网站建设
  • 建设电子商务网站的规划书电子商务平台网站模板
  • 桂林网站建设 腾云安康养老院收费
  • 网站建设找酷风旅游手机网站开发
  • 宜昌建设厅网站开发公司起名大全
  • 龙口建设局网站深圳十大网站建设公司
  • 湛江网站设计哪家好公司网址怎么查询
  • 网站怎么设置关键词河南宣传片制作公司
  • 做网站 怎么赚钱吗安乡网站制作
  • 国外展览展示设计网站沧州网络推广管理公司
  • 物流信息平台网站建设深圳做手机网站建设
  • 品牌型网站的特点领导视察网站建设
  • 如何自己做网站推广淘宝客佛山小程序开发公司
  • 天津市建设局网站口碑营销相关案例
  • 怎么有自己的网站厂字形网页布局网站
  • 广州市财贸建设开发监理网站工程建设企业等采用
  • 网站建设规模设想自己建立网站教程
  • 兰溪建设局网站门户网站建设招标
  • 用wp做网站备案怎么查自己的邮箱号
  • 苏州企业网站建设公司价格数字媒体应用 网站开发
  • 西宁做网站seo四川省的住房和城乡建设厅网站首页
  • 响应式网站 有哪些弊端可以发广告的网站
  • wordpress 漫画站wordpress加目录
  • 天津商城网站制作深圳品牌网站设计公司
  • 初学网站开发上海市普陀区建设规划局网站
  • 网站开发完成后如何发布做网站用vs还是dw
  • 怎么看网站是否备案可信赖的菏泽网站建设
  • 做网站的优点系统软件开发服务