思维导图:

我们先来看 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 设计模式之 策略模式的更多相关文章

  1. Java设计模式1——策略模式(Strategy Pattern)

    最近觅得一本好书<您的设计模式>,读完两章后就能断言,一定是一头极品屌丝写的,而且是专写给开发屌丝男的智慧枕边书,小女子就委屈一下,勉强看看,人笨,谁让他写得这么通俗易懂呢!为了加深理解, ...

  2. JAVA设计模式 之 策略模式

    一. 定义 设计模式定义了算法族,分别封装起来,让他们之间可以互相替代,此模式让算法的变化独立于使用算法的客户(该定义来自于Head First 设计模式). 二. 应用场景 当我们在应用程序中完成一 ...

  3. Java设计模式之策略模式(一)

    今年寒假没有回家,打算利用这个假期的时间进行学习设计模式,这一个人感觉比较牛的知识,前一段时间一直在忙着搞自己的专业课,还有就是捣鼓了一下Linux系统,没有好好的学习关于Java还有Android方 ...

  4. Java设计模式---Strategy策略模式

    参考于 : 大话设计模式 马士兵设计模式视频 1.场景介绍 购物网站上有一个产品,有三个字段,档次,价格,重量. 有些同学喜欢轻的,有些手头紧,想要便宜的,有些喜欢档次高的. 那么我们为了提高网站用户 ...

  5. 折腾Java设计模式之策略模式

    博客原文地址 简介 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式.简单理解就是一组算法,可以互换,再简单点策略就是封装算法. ...

  6. java设计模式之策略模式

    策略模式 定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户(大话设计模式). 策略模式UML图   策略模式代码 古代的各种计谋都是一种策略,这次我们 ...

  7. Java设计模式之-----策略模式

    首先,我们来看下策略模式的概念.一般的解释如下:     策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.(原文:The St ...

  8. java设计模式之——策略模式

    1.策略模式有什么好处? 策略模式的好处在于你可以动态的改变对象的行为. 2.设计原则 设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++中可以用虚类),然后在类中包含这 ...

  9. 小白学习java设计模式之策略模式

    策略模式:1.分析项目中的变化部分与不变部分(每个设计模式都要分析的)2.多用组合少用继承;用行为类组合,而不是行为继承,更具有弹性直接上代码: package com.wz.oneStrategis ...

随机推荐

  1. python 操作openpyxl导出Excel 设置单元格格式以及合并处理

    贴上一个例子,里面设计很多用法,根据将相同日期的某些行合并处理. from openpyxl import Workbook from openpyxl.styles import Font, Fil ...

  2. GIt 添加到远程

    转载:https://www.liaoxuefeng.com/wiki/896043488029600/898732864121440 添加到远程 1.注册/登录 GitHub(https://git ...

  3. idea多行注释缩进

    选中多行代码 - 按下tab键——向后整体移动 选中多行代码 - 按下shift + tab键——向前整体缩进(整体去掉代码前面的空格)

  4. mooc-IDEA 列操作--005

    十一.IntelliJ IDEA -列操作 实例:根据HTTP请求JSON文件,生成一个枚举类 Step1:创建一个枚举类,把要转换的JSON串粘贴进来. 最终要实现效果 Step2:选中第一个100 ...

  5. MYSQL的ACID

    原子性 (Atomicity) 原子性是指一个事务是一个不可分割的工作单位,其中的操作要么都做,要么都不做. 隔离性 (Isolation) 隔离性是指多个事务并发执行的时候,事务内部的操作与其他事务 ...

  6. 快速排序 && 寻找第K大(小)的数

    参考:https://minenet.me/2016/08/24/quickSort.html 快速排序 利用分治法可将快速排序的分为三步: 在数据集之中,选择一个元素作为"基准" ...

  7. python 链接交换机并执行相关命令

    原文地址 https://blog.csdn.net/u010897775/article/details/80311786?utm_source=blogxgwz0 # encoding=utf-8 ...

  8. [Python3 填坑] 006 “杠零”,空字符的使用

    目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 \0 是空字符,输出时看不到它,但它占 1 个字符的长度 2.2 \0 "遇八进制失效" 2.3 \0 与 '' 不 ...

  9. Web API 入门三(参数绑定)

    学到现在,感觉到微软的.NET各种框架和模型基础大致都差不多,所以,这部分内容大致和MVC部分差不多.在学习参事绑定之前,我们肯定要知道Controller(即控制器)是啥干啥的. 其实,Contro ...

  10. hdu-2819.swap(二分匹配 + 矩阵的秩基本定理)

    Swap Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...