首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

了解23种设计模式之策略模式

  • 25-03-02 13:43
  • 3487
  • 10630
blog.csdn.net

一,什么是策略模式

   Strategy 模式也叫策略模式是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略)。Strategy 模式主要用来平滑地处理算法的切换。

二,策略模式的接口

三,策略模式的角色和职责,优点,缺点

Strategy : 策略(算法)抽象。

ConcreteStrategy :各种策略(算法) 的具体实现

Contenxt :策略的外部封装类,或者说策略的容器类。根据不同策略执行不同的行为。策略由外部环境决定。

优点:

1,策略模式提供了管理相关的算法的办法。策略模式的等级结构定义了一个算法或行为族,恰当使用继承可以把公共的代码移到父类里面,从而避免重复的代码。

2,策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为。如果不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法或行为。但是,这样一来算法或采取哪一种行为的逻辑就和算法或行为的逻辑混合在一起,从而不可能再独立演化。继承使得动态改变算法或行为变得不可能。

3,使用策略模式可以避免使用多重条件转移语句。多重转移语句不易维护。它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起。统统列在一个多重转移语句里面,比使用继承的办法还要原始和落后。

缺点:

1,客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。

2,策略模式造成很多的策略类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成共享的,这样策略类实例可以被不同的客户端使用。换言之,可以使用亨元模式来减少对象的数量。

四:代码的实现:

  4.1 Strategy : 策略(算法)抽象。

  1. /**
  2. * @ClassName Strategy
  3. * @Description TODO
  4. * @Version 1.0
  5. **/
  6. public interface Strategy {
  7. /**
  8. * @Description: 加密
  9. * @param:
  10. * @return: void
  11. **/
  12. public void encrypt();
  13. }

4.2 ConcreteStrategy :各种策略(算法) 的具体实现

  1. /**
  2. * @ClassName Md5Strategy
  3. * @Description TODO
  4. * @Version 1.0
  5. **/
  6. public class Md5Strategy implements Strategy {
  7. /**
  8. * @Description: 实现加密方法
  9. * @param: []
  10. * @return: void
  11. **/
  12. @Override
  13. public void encrypt() {
  14. System.out.println("执行Md5加密算法");
  15. }
  16. }
  1. /**
  2. * @ClassName Base64Srategy
  3. * @Description TODO
  4. * @Version 1.0
  5. **/
  6. public class Base64Srategy implements Strategy {
  7. @Override
  8. public void encrypt() {
  9. System.out.println("执行Base64加密算法");
  10. }
  11. }

4.3 Context :策略的外部封装类,或者说策略的容器类。根据不同策略执行不同的行为。策略由外部环境决定。

  1. /**
  2. * @ClassName Context
  3. * @Description TODO
  4. * @Version 1.0
  5. **/
  6. public class Context {
  7. private Strategy strategy;
  8. public Context(Strategy strategy) {
  9. this.strategy = strategy;
  10. }
  11. public void encrypt(){
  12. this.strategy.encrypt();
  13. }
  14. }

4.4 结合简单工厂模式 ,让创建实例化的对象变得更加优雅

  1. /**
  2. * @ClassName StrategyCreator
  3. * @Description 工厂类
  4. * @Version 1.0
  5. **/
  6. public class StrategyFactory {
  7. public static Context getContext(String type){
  8. try {
  9. Class strategy = Class.forName(type);
  10. return new Context((Strategy) strategy.newInstance());
  11. } catch (ClassNotFoundException e) {
  12. e.printStackTrace();
  13. System.out.println("找不到对象");
  14. }catch (InstantiationException e){
  15. e.getMessage();
  16. System.out.println("实例化错误");
  17. }catch (IllegalAccessException e){
  18. e.getMessage();
  19. System.out.println("非法访问异常");
  20. }
  21. return null;
  22. }
  23. }

4.5 测试

  1. /**
  2. * @ClassName Test
  3. * @Description TODO
  4. * @Version 1.0
  5. **/
  6. public class Test {
  7. public static void main(String[] args) {
  8. Context context = StrategyFactory.getContext("com.enjoy.Cap21.Md5Strategy");
  9. context.encrypt();
  10. }
  11. }

文章知识点与官方知识档案匹配,可进一步学习相关知识
Java技能树首页概览148947 人正在系统学习中
注:本文转载自blog.csdn.net的可乐cc呀的文章"https://blog.csdn.net/Crazy_Cw/article/details/106818217/"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top