Java 设计模式之 策略模式
思维导图:

我们先来看 STRATEGY 设计模式的通俗解释:
跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,但目的都是为了得到 MM 的芳心,我的追 MM 锦囊中有好多 Strategy 哦。
策略模式:
策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。
策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。
例1:
首先定义一个接口,这个接口是诸葛亮给赵云三个妙计的接口。
1、将公共的部分抽象为接口;
下面这个接口是算法类的公共接口。
package com.liwei.strategy;
/**
* 首先定义一个接口,这个接口是诸葛亮给赵云三个妙计的接口
* @author Administrator
*
*/
public interface IStrategy {
/**
* 每个妙计都是一个可以执行的算法
*/
public void operate();
}
2、写好三个实现类
package com.liwei.strategy.impl; import com.liwei.strategy.IStrategy;
/**
* 妙计实现类之一
* @author Administrator
*
*/
public class BackDoor implements IStrategy {
@Override
public void operate() {
System.out.println("找乔国老开后门,让吴国太给孙权施加压力,使孙权不能杀刘备。");
} }
package com.liwei.strategy.impl; import com.liwei.strategy.IStrategy; /**
* 妙计实现类之一
*
* @author Administrator
*
*/
public class BlackEnemy implements IStrategy {
@Override
public void operate() {
System.out.println("孙夫人出面,挡住追兵。");
} }
package com.liwei.strategy.impl; import com.liwei.strategy.IStrategy;
/**
* 妙计实现类之一
* @author Administrator
*
*/
public class GivenGreenLight implements IStrategy {
@Override
public void operate() {
System.out.println("求吴国太开个绿灯,甘露寺解围!");
} }
3、把实现类放在一个环境里(无须实现接口、可以认为是对外提供一个方法)
package com.liwei.strategy;
/**
* 这是锦囊,存放妙计的地方
* @author Administrator
*
*/
public class Context {
private IStrategy strategy; /**
* 使用构造函数注入,指明你要使用哪一条妙计
* @param strategy
*/
public Context(IStrategy strategy) {
this.strategy = strategy;
} /**
* 这是锦囊的方法,由锦囊产生妙计,而妙计由注入的妙计接口来决定
*/
public void oper(){
/**
* 这个时候,真正传进来的妙计要真正出马了
*/
this.strategy.operate();
}
}
4、编写测试类
package com.liwei.strategy; import com.liwei.strategy.impl.BackDoor;
import com.liwei.strategy.impl.BlackEnemy;
import com.liwei.strategy.impl.GivenGreenLight; public class Test {
/**
* 这里要注意:是锦囊执行了操作
* @param args
*/
public static void main(String[] args) {
Context context;
// 刚到吴国的时候拆开第 1 个
System.out.println("------刚到吴国的时候拆开第 1 个锦囊了------");
context = new Context(new BackDoor());
context.oper();
System.out.println("\n\n");
System.out.println("------这时刘备乐不思蜀,开始拆第 2 个锦囊了------");
context = new Context(new GivenGreenLight());
context.oper();
System.out.println("\n\n");
System.out.println("------孙权追兵到了,开始拆第 3 个锦囊了------");
context = new Context(new BlackEnemy());
context.oper();
}
}
例2:
1、定义一个算法类的公共接口;
这个接口只是定义了计算,如何计算?两个操作数是加、减、乘、除?
package com.shejimoshi.celue;
public interface Strategy {
public int calculate(int a,int b);
}
2、实现算法接口的类;
package com.shejimoshi.celue;
public class AddStrategy implements Strategy {
@Override
public int calculate(int a, int b) {
return a + b;
}
}
package com.shejimoshi.celue;
public class SubtractStrategy implements Strategy {
@Override
public int calculate(int a, int b) {
return a - b;
}
}
package com.shejimoshi.celue;
public class MulStrategy implements Strategy {
@Override
public int calculate(int a, int b) {
return a * b;
}
}
3、定义一个环境类;
package com.shejimoshi.celue;
public class Environment {
private Strategy strategy;
public Environment(Strategy strategy) {
super();
this.strategy = strategy;
}
public Strategy getStrategy() {
return strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public int calculate(int a, int b) {
return this.strategy.calculate(a, b);
}
}
4、由环境类执行操作。
package com.shejimoshi.celue;
public class Client {
public static void main(String[] args) {
/**
* 理解策略设计模式要注意留意 Java 中多态的概念
*/
AddStrategy addStrategy = new AddStrategy();
Environment environment = new Environment(addStrategy);
System.out.println(environment.calculate(4, 3));
// 减法
SubtractStrategy subStrategy = new SubtractStrategy();
environment.setStrategy(subStrategy);
System.out.println(environment.calculate(4, 3));
// 乘法
MulStrategy multiplyStrategy = new MulStrategy();
environment.setStrategy(multiplyStrategy);
System.out.println(environment.calculate(4, 3));
}
}
Java 设计模式之 策略模式的更多相关文章
- Java设计模式1——策略模式(Strategy Pattern)
最近觅得一本好书<您的设计模式>,读完两章后就能断言,一定是一头极品屌丝写的,而且是专写给开发屌丝男的智慧枕边书,小女子就委屈一下,勉强看看,人笨,谁让他写得这么通俗易懂呢!为了加深理解, ...
- JAVA设计模式 之 策略模式
一. 定义 设计模式定义了算法族,分别封装起来,让他们之间可以互相替代,此模式让算法的变化独立于使用算法的客户(该定义来自于Head First 设计模式). 二. 应用场景 当我们在应用程序中完成一 ...
- Java设计模式之策略模式(一)
今年寒假没有回家,打算利用这个假期的时间进行学习设计模式,这一个人感觉比较牛的知识,前一段时间一直在忙着搞自己的专业课,还有就是捣鼓了一下Linux系统,没有好好的学习关于Java还有Android方 ...
- Java设计模式---Strategy策略模式
参考于 : 大话设计模式 马士兵设计模式视频 1.场景介绍 购物网站上有一个产品,有三个字段,档次,价格,重量. 有些同学喜欢轻的,有些手头紧,想要便宜的,有些喜欢档次高的. 那么我们为了提高网站用户 ...
- 折腾Java设计模式之策略模式
博客原文地址 简介 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式.简单理解就是一组算法,可以互换,再简单点策略就是封装算法. ...
- java设计模式之策略模式
策略模式 定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户(大话设计模式). 策略模式UML图 策略模式代码 古代的各种计谋都是一种策略,这次我们 ...
- Java设计模式之-----策略模式
首先,我们来看下策略模式的概念.一般的解释如下: 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.(原文:The St ...
- java设计模式之——策略模式
1.策略模式有什么好处? 策略模式的好处在于你可以动态的改变对象的行为. 2.设计原则 设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++中可以用虚类),然后在类中包含这 ...
- 小白学习java设计模式之策略模式
策略模式:1.分析项目中的变化部分与不变部分(每个设计模式都要分析的)2.多用组合少用继承;用行为类组合,而不是行为继承,更具有弹性直接上代码: package com.wz.oneStrategis ...
随机推荐
- python 操作openpyxl导出Excel 设置单元格格式以及合并处理
贴上一个例子,里面设计很多用法,根据将相同日期的某些行合并处理. from openpyxl import Workbook from openpyxl.styles import Font, Fil ...
- GIt 添加到远程
转载:https://www.liaoxuefeng.com/wiki/896043488029600/898732864121440 添加到远程 1.注册/登录 GitHub(https://git ...
- idea多行注释缩进
选中多行代码 - 按下tab键——向后整体移动 选中多行代码 - 按下shift + tab键——向前整体缩进(整体去掉代码前面的空格)
- mooc-IDEA 列操作--005
十一.IntelliJ IDEA -列操作 实例:根据HTTP请求JSON文件,生成一个枚举类 Step1:创建一个枚举类,把要转换的JSON串粘贴进来. 最终要实现效果 Step2:选中第一个100 ...
- MYSQL的ACID
原子性 (Atomicity) 原子性是指一个事务是一个不可分割的工作单位,其中的操作要么都做,要么都不做. 隔离性 (Isolation) 隔离性是指多个事务并发执行的时候,事务内部的操作与其他事务 ...
- 快速排序 && 寻找第K大(小)的数
参考:https://minenet.me/2016/08/24/quickSort.html 快速排序 利用分治法可将快速排序的分为三步: 在数据集之中,选择一个元素作为"基准" ...
- python 链接交换机并执行相关命令
原文地址 https://blog.csdn.net/u010897775/article/details/80311786?utm_source=blogxgwz0 # encoding=utf-8 ...
- [Python3 填坑] 006 “杠零”,空字符的使用
目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 \0 是空字符,输出时看不到它,但它占 1 个字符的长度 2.2 \0 "遇八进制失效" 2.3 \0 与 '' 不 ...
- Web API 入门三(参数绑定)
学到现在,感觉到微软的.NET各种框架和模型基础大致都差不多,所以,这部分内容大致和MVC部分差不多.在学习参事绑定之前,我们肯定要知道Controller(即控制器)是啥干啥的. 其实,Contro ...
- hdu-2819.swap(二分匹配 + 矩阵的秩基本定理)
Swap Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...