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

设计模式:7、策略模式(政策)

目录

0、定义

1、策略模式的三种角色

2、策略模式的UML类图

3、示例代码


0、定义

        定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

1、策略模式的三种角色

  • 策略(Strategy):策略是一个接口,该接口定义若干个算法标识,即定义了若干个抽象方法。
  • 具体策略(concreteStrategy):具体策略是实现策略接口的类。具体策略实现策略接口所定义的抽象方法,即给出算法标识的具体算法。
  • 上下文(Context):上下文是依赖于策略接口的类,即上下文包含有策略声明的变量。上下文中提供一个方法,该方法委托策略变量调用具体策略所实现的策略接口中的方法。

2、策略模式的UML类图

3、示例代码

策略:

package xyz.jangle.design.strategy;

public interface Strategy {
	
	public void algorithm();

}

具体策略A

package xyz.jangle.design.strategy;

public class ConcreteStrategyA implements Strategy {

	@Override
	public void algorithm() {
		System.out.println("这是方法A");
	}

}

具体策略B

package xyz.jangle.design.strategy;

public class ConcreteStrategyB implements Strategy {

	@Override
	public void algorithm() {
		System.out.println("这是方法B");
	}

}

上下文

package xyz.jangle.design.strategy;

public class Context {
	
	private Strategy strategy;

	public Context(Strategy strategy) {
		super();
		this.strategy = strategy;
	}

	public void setStrategy(Strategy strategy) {
		this.strategy = strategy;
	}
	
	public void lookAlgorithm() {
		strategy.algorithm();
	}
	

}

客户端(使用)

package xyz.jangle.design.strategy;

public class AppMain7 {

	public static void main(String[] args) {
		ConcreteStrategyA strategyA = new ConcreteStrategyA();	
		Context context = new Context(strategyA);		// 注入策略A
		context.lookAlgorithm();
		System.out.println("-------------");
		context.setStrategy(new ConcreteStrategyB());	// 注入策略B
		context.lookAlgorithm();

	}

}

执行结果:

这是方法A
-------------
这是方法B


http://www.kler.cn/a/409611.html

相关文章:

  • [极客大挑战 2019]BabySQL--详细解析
  • Linux 命令和 vi/vim 命令
  • Macos远程连接Linux桌面教程;Ubuntu配置远程桌面;Mac端远程登陆Linux桌面;可能出现的问题
  • 【linux学习指南】初识Linux进程信号与使用
  • C# 读取多条数据记录导出到 Word标签模板之图片输出改造
  • MySQL中的ROW_NUMBER窗口函数简单了解下
  • SpringBoot源码解析(五):准备应用环境
  • Design a Multiplayer Hero Shooter Map in UE5
  • Cocos游戏优化
  • 大模型论文速递(11.23-11.25)
  • Linux操作系统学习---初识环境变量
  • 力扣-Hot100-栈【算法学习day.40】
  • 梧桐数据库的高效索引技术行业调研报告
  • 理解clickhouse 里的分区和分片键区别
  • 降本增效的新利器
  • 第49届ICPC亚洲区域赛,非凸科技再次支持上海赛站
  • TensorFlow手动更新模型特定变量
  • 重写radioselect类自定义个性化单选框
  • Flink四大基石之Window
  • 黄仁勋:人形机器人在内,仅有三种机器人有望实现大规模生产
  • Web 学习笔记 - 网络安全
  • 简单快速区分Shell, sh, bash:
  • C/C++中的回调用法
  • 【测试工具JMeter篇】JMeter性能测试入门级教程(二)出炉,测试君请各位收藏了!!!
  • 《用 Python 和 Tkinter 打造惊喜弹窗小应用教程》
  • 【MySQL】数据库 Navicat 可视化工具与 MySQL 命令行基本操作