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 ...
随机推荐
- Jmeter JDBC请求-----数据库读取数据进行参数化 通过SSH跳板机连接数据库
前期准备: jdbc驱动:mysql-connector-java-5.1.7-bin.jar Jmeter 要链接MySQL数据库,首选需要下载mysql jdbc驱动包(注:驱动包的版本一定要与你 ...
- display:table
display:table的CSS声明能够让一个HTML元素和它的子节点像table元素一样.使用基于表格的CSS布局,使我们能够轻松定义一个单元格的边界.背景等样式,而不会产生因为使用了table那 ...
- MySQL基础和习题强化(完结)
Mysql 1. Mysql基础知识 1.1. Index and table searching of Mysql 1.1.1. Basic concepts of Mysq ...
- [Git] 011 checkout 与 reset 命令的补充
1. git checkout -- <file> 的示意 2. "checkout" 的补充 2.1 git checkout <branch_name> ...
- Flask搭建简单的get请求
用virtualenv venv搭建python虚拟环境.然后执行. #!/usr/bin/env pythonfrom flask import Flask, render_template, re ...
- Springboot(java)程序部署到k8s
新建rc(replication controller) 以下操作在master1做 rc是一套程序部署的配置,k8s会根据配置自动运行和管理程序,例如自动启动程序,程序挂了自动重启等等 rc配置一般 ...
- Leetcode Lect7 哈希表
传统的哈希表 对于长度为n的哈希表,它的存储过程如下: 根据 key 计算出它的哈希值 h=hash(key) 假设箱子的个数为 n,那么这个键值对应该放在第 (h % n) 个箱子中 如果该箱子中已 ...
- .NET的优点(转载)
一:什么是.NET?它包括什么? .Net是为简化在第三代因特网的高分布式环境下的应用程序开发,基于开放互联网标准和协议之上,实现异质语言和平台高度交互性,而构建的新一代计算和通信平台. .Net主要 ...
- [好好学习]在VMware中安装Oracle Enterprise Linux (v5.7) - (1/5)
在想到Oracle Enterprise Linux,第一时间就是在Oracle官网上找到资源,但是,出现以下图片
- ASE Alpha Sprint - backend scrum 2
本次scrum于2019.11.5再sky garden进行,持续30分钟. 参与人: Zhikai Chen, Jia Ning, Haifeng Chen, Hao Wang 请假: Xin Ka ...