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 ...
随机推荐
- 当我写下Map<String,Object> map = new HashMap<>() https://www.jianshu.com/p/6b2e350e99be
当我写下Map<String,Object> map = new HashMap<>();我到底在写什么? 我什么时候会写HashMap? 一个函数同时需要返回 多种 状态的情 ...
- 应用安全 - 代码审计 - Python
flask客户端session导致敏感信息泄露 flask验证码绕过漏洞 CodeIgniter 2.1.4 session伪造及对象注入漏洞 沙箱逃逸
- <编译原理 - 函数绘图语言解释器(3)解释器 - python>
<编译原理 - 函数绘图语言解释器(3)解释器 - python> <编译原理 - 函数绘图语言解释器(2)词法分析器 - python> <编译原理 - 函数绘图语言解 ...
- URIs, URLs, and URNs
首先,URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源.而URL是uniform resource locator,统一资源定位器,它是一种具体 ...
- Mysql UPF 安装文档
一.mysql UDF 简介: github地址: http://www.mysqludf.org/lib_mysqludf_preg 二.mysql UDF 下载地址: https://github ...
- css定位:相对定位、绝对定位、固定定位的区别与特性
css定位:相对定位.绝对定位.固定定位的区别与特性 原文地址:http://www.qingzhouquanzi.com/106.html css定位常用的有以下三种: 使用了定位的共同特性: 这三 ...
- jQuery 的attr()与css()的区别
attr是attribute的缩写,意思是标签属性. css是,样式,意思是元素的style样式的 我的理解是: attr是操作元素的 属性 css是操作元素的 style属性 前者可以修改&l ...
- Django重点之url别名
django重点之url别名[参数名必须是name,格式是name="XXX] 不论后台路径如何进行修改路径,前台访问的路径不变,永远是alias, 这样方便开发 前台根据 {{ url & ...
- Angular 组件通讯方式
(一)父子组件 输入/输出属性 关键词 Input,Output,EventEmitter. 父子组件信息信息,分为 (1)子组件向父组件传递 (2)父组件向子组件传递 (二)模版变量与 @V ...
- PCIe基础篇(一)、基础知识扫盲
1.PCIe:Peripheral Component interconnect Expess,外围组件接口互联,属于第三代IO总线,PCIe的传输速率指的是实际的有效传输速率,为RAW data(原 ...