思维导图:

我们先来看 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. vue组件的watch属性

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. WordPress致命错误 紧急处理代码

    将下面代码添加到当前主题函数模板 functions.php 中: dadd_filter( 'wp_fatal_error_handler_enabled', '__return_false' );

  3. The second curriculum design experiment report in spring 2019

    2019年第二次课程设计实验报告 一.实验项目名称 贪吃蛇 二.实验项目功能描述 1.小蛇的移动 玩家可以通过 W A S D控制小蛇的上左下右移动,通过函数改变小蛇部位的位置 2.判断游戏失败 当小 ...

  4. jQuery难学是因为什么?

    我们看别人写的js代码,发现很多不明白,其实只是你对语法不清楚.对函数方法了解的不全面. /****************************************************** ...

  5. HNUSTOJ-1689 送外卖(TSP问题)

    1698: 送外卖 时间限制: 1 Sec  内存限制: 128 MB 提交: 115  解决: 24 [提交][状态][讨论版] 题目描述 在美团和饿了么大行其道的今天,囊中羞涩的小周和小美,也随大 ...

  6. 第一个javascript脚本

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. installsheild2011打包程序internal build error 6213

    今天打包一个安装程序,总是出现报错,internal build error -6213,然后搜遍都没有找到什么解决方案.看到一个帖子,说是因为installsheild里面的build的时候自动扫描 ...

  8. smarty之缓存机制

    当smarty开启缓存时,当tpl文件内容改变时,则缓存页面会重新生成 test.php: <?php date_default_timezone_set('asia/shanghai'); h ...

  9. CentOS6.5系统解决中文乱码问题

      一.    问题详情 Windows的默认编码为GBK,Linux的默认编码为UTF-8.在Windows下编辑的中文,在Linux下显示为乱码.为了解决此问题,修改Linux的默认编码为GBK. ...

  10. mysql查询每个部门/班级前几名

    Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id . +----+-------+--------+--------------+ | I ...