博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
策略模式
阅读量:6906 次
发布时间:2019-06-27

本文共 1748 字,大约阅读时间需要 5 分钟。

 

应用场景:

1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。

 

 

首先看代码,了解实现思路,然后进行总结,前面讲一堆,作为新手,直接懵了!

 

 

一、抽象策略角色: 策略类,通常由一个接口或者抽象类实现。

1、接口

定义一个方法,在实现类中实现它,用于执行“加、减”操作

/* * 策略接口 */public interface Strategy {	public int doOperation(int num1 , int num2);	}

 

二、具体策略角色:包装了相关的行为。

1、第一个实现类:执行“加”操作

/* * 策略接口实现类:加 */public class OperationAdd implements Strategy {	@Override	public int doOperation(int num1, int num2) {		return num1 + num2;	}}

 

2、第二个实现类:执行“减”操作

/* * 策略接口实现类:减 */public class OperationSubstract implements Strategy{	@Override	public int doOperation(int num1, int num2) {		return num1 - num2;	}}

 

三、环境角色:持有一个策略类的引用,最终给客户端调用。

在此为:Context类 ,定义 当它改变策略 Strategy 时的行为变化。

public class Context {	private Strategy strategy ;		//new "加"对象,Strategy为"加"实现类; new "减"对象,Strategy为"减"实现类;	public Context(Strategy strategy){			this.strategy = strategy;	}		public int executeStrategy(int num1, int num2){	      return strategy.doOperation(num1, num2);	}}

 

四、Main类

 

public class StrategyPatternDemo {		public static void main(String[] args) {				//new "加"对象		Context context = new Context(new OperationAdd());		System.out.println("10 + 5 = " + context.executeStrategy(10, 5));				//new "减"对象		context = new Context(new OperationSubstract());        	    System.out.println("10 - 5 = " + context.executeStrategy(10, 5));	}	}

 

 

设计原则一:找出程序中可能需要变化的地方和不需要变化的地方,将它们独立开来。让系统中的某部分改变不会影响其他部分。

设计原则二:针对接口编程,而不是针对实现。

  比如,为了实现复用,采用继承父类的方法,子类就都继承了父类的这些行为;但是有时候,父类的这些方法,不同的子类可能想要的不一样,这不是想要的结果;

  面向接口编程,接口定义一个方法,接口的实现类根据不同行为来分别实现。在运行时可以动态选择具体要执行的行为,比如上面Main方法里,需要什么行为,就new哪个接口的实现类。

设计原则三:多用组合,少用继承。

  "加"和"减"这两种不同的行为,我们分别为其建立两组不同的行为类,然后在Context类中通过接口实例变量结合起来,这就是”组合“。使得系统具有很大的弹性,还可以”在运行时动态地改变行为“。

 

转载于:https://www.cnblogs.com/Donnnnnn/p/7552720.html

你可能感兴趣的文章
实战Apache+Tomcat集群和负载均衡
查看>>
第八周(2) Word邮件合并1
查看>>
Context 之我见
查看>>
让一个表单以post的方式在window.open的窗口中打开
查看>>
FreeNAS 9.1.1 发布,网络存储系统 - 开源中国社区
查看>>
极客技术专题【011期】:EasyUI初级教程
查看>>
unicat,multicast,broadcast区别
查看>>
LINUX Find命令使用
查看>>
FAQ:仓储实现为什么在基础设施层?
查看>>
win7下面完全删除mysql
查看>>
linux IP 设置
查看>>
vs在线工具杂烩
查看>>
vim语法高亮不起作用解决
查看>>
第一部分:开发前的准备-第四章 多分辨率多屏幕的支持
查看>>
一款超炫的jquery图片播放插件[Cloud Carousel]
查看>>
Android系统源代码下载
查看>>
微软BI 之SSAS 系列 - 多维数据集维度用法之一 引用维度 Referenced Dimension
查看>>
Mustache.js语法学习笔记
查看>>
同一个String在使用不同的charset编码的时候equals仍然是返回true吗
查看>>
小案例:struts1.3利用nested标签使用POJO
查看>>