策略模式-Strategy(Java实现)
策略模式-Strategy
在策略模式中,一个类(策略使用者)可以更改自己的执行策略. 比如以排序算法为例子, 多种排序算法都归属于排序算法, 但是实现的算法细节不同, 使用者可以很轻松地替换策略, 选择其中一个来执行任务.
本文基本就是copy了一下Ilkka Seppälä(github里的iluwatar)的例子, 他的例子非常形象.
场景是这样的: 有一个屠龙勇士, 他会替换不同的装备(策略)来对抗不同的龙.
类关系图如下:
依赖关系图如下:
定义
DragonSlayingStrategy接口
策略模式有很多的策略, 在这里把屠龙策略抽象出来, 定义一下屠龙场景中的策略DragonSlayingStrategy接口.
/**
* 屠龙策略接口
*/
@FunctionalInterface
public interface DragonSlayingStrategy {
void execute();
}
DragonSlayer类
在这里定义了屠龙勇士DragonSlayer.
屠龙勇士有一个默认策略, 还可以进行替换策略的操作, 还可以使用当前的策略来进行攻击.
/**
* 屠龙勇士
*/
public class DragonSlayer {
/**
* 屠龙策略
*/
private DragonSlayingStrategy strategy; /**
* 如果是空参构造器, 那么赋上一个默认的策略
*/
public DragonSlayer() {
strategy = new DragonSlayingStrategy() {
@Override
public void execute() {
System.out.println("默认策略: 拳打脚踢");
}
};
} /**
* 传入一个策略, 根据这个策略来进行实例化屠龙勇士
*/
public DragonSlayer(DragonSlayingStrategy strategy) {
this.strategy = strategy;
} /**
* 策略是可以随时变的, change一下就好了
*/
public DragonSlayer changeStrategy(DragonSlayingStrategy strategy) {
this.strategy = strategy;
return this;
} /**
* 使用当前策略来执行屠龙
*/
public void goToBattle() {
this.strategy.execute();
}
}
实现
基本的模型已经出来, 但是咱们还没有创建具体的策略类呢, 让我们来创建两个吧
SpellStrategy类
/**
* 念魔咒策略
*/
public class SpellStrategy implements DragonSlayingStrategy{ @Override
public void execute() {
System.out.println("魔咒策略: 念魔咒把龙封印掉");
}
}
FireStrategy类
/**
* 火器策略
*/
public class FireStrategy implements DragonSlayingStrategy {
@Override
public void execute() {
System.out.println("火器策略: 用火烧");
}
}
Main
这里是运行示例
public class Main {
public static void main(String[] args) {
// 有一个屠龙勇士
DragonSlayer slayer = new DragonSlayer(); System.out.println("\n幼龙出现啦"); slayer.goToBattle(); /*-************世界安静了片刻**************-*/ System.out.println("\n冰龙出现啦!"); //屠龙勇士发现可以用火克制他, 于是换了火器策略, 进行攻击
slayer.changeStrategy(new FireStrategy()).goToBattle(); /*-************世界安静了片刻**************-*/ System.out.println("\n远古巨龙出现啦!"); // 巨龙太强大了, 只能装备好念魔咒这个技能, 然后攻击
slayer.changeStrategy(new SpellStrategy()).goToBattle(); /*-************世界安静了片刻**************-*/ System.out.println("\n魔龙出现啦"); // 屠龙勇士用光了所有策略, 现场学会了一个新的技能, 还没来得及给这个技能起名字呢, 屠龙要紧, 快快快
slayer.changeStrategy(new DragonSlayingStrategy() {
@Override
public void execute() {
System.out.println("神秘技能: 顿悟出一套从天而降的掌法, 如来神掌!");
}
}).goToBattle(); /*-************世界安静了片刻**************-*/
System.out.println("\n神龙出现啦"); // 屠龙勇士利用函数式编程发明了一种新的神级招式: 洗脑
slayer.changeStrategy(()-> System.out.println("洗脑策略: 洗脑~~~~~~")).goToBattle();
}
}
策略模式-Strategy(Java实现)的更多相关文章
- Java 设计模式系列(十二)策略模式(Strategy)
Java 设计模式系列(十二)策略模式(Strategy) 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以 ...
- JAVA设计模式之策略模式 - Strategy
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...
- 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)
在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...
- 十一个行为模式之策略模式(Strategy Pattern)
定义: 定义一系列的算法,将每一个算法封装起来,并使它们之间可以相互替换,让算法具有可扩展性和对立性. 结构图: Context:环境类,算法的使用者.对外提供了算法使用的接口,并且持有一个抽象算法类 ...
- 策略模式(strategy pattern)
策略模式在java集合中的TreeSet和TreeMap中得到了很好的应用,我们可以实现Comparator接口实现Compareto()方法来定义自己的排序规则,然后通过TreeSet,TreeMa ...
- 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...
- 设计模式 - 策略模式(Strategy Pattern) 具体解释
策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...
- HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern)
策略模式(Strategy Pattern): 定义了了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端. 第一个设计原则:找出应用中可能需要变化之处,把他们独立 ...
随机推荐
- 测者的测试技术手册:测试应该关注java.util.List.subList的坑
java中有一个返回子列表的方法: public list<E> subList(int fromIndex, int toIndex){ subListRangeCheck( ...
- 好代码是管出来的——使用GitHub
前面的文章介绍了Git的基本概念和用法,本文则是基于GitHub的一个实践介绍,主要内容有: GitHub简介 个人与组织 仓库的创建与维护 Fork与pull request 小结 GitHub简介 ...
- Websocket-Sharp获取客户端IP地址和端口号
//OnOpen事件 protected override void OnOpen() { string IPAddress = base.Sessions.Sessions.First().Cont ...
- EOS开发环境搭建
EOS开发环境搭建 在上一篇文章<扒一扒EOS的前世今生>中,我们已经了解了EOS以及他的创始人Daniel Larimer的故事,本次为大家带来的是关于EOS开发环境搭建的内容.首先 ...
- oracle相关函数
(大写的PS:oracle存储过程测试进不去解决方案:重新编译:) TRUNC(sysdate, 'd') + 1 ////表示今天所在周的周一的年月日,如今天是2016.04.21周四,则TRU ...
- UNIX DOMAIN SOCKET效率
关于UNIX DOMAIN SOCKET和普通udp socket的对比 在TX1(4核A57 1.7GHz)的板卡上进行测试,每个包大小设置为1024,全速收发,UDS的速度在90Mbps左右,UD ...
- windows常用目录
启动目录位置 %USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
- 网络流 之 P2766 最长不下降子序列问题
题目描述 «问题描述: 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的不下降子序列. (3)如果允许在取出的序列中多次 ...
- Navicat Premium 12.1.16.0安装与激活
声明:本文所提供的所有软件均来自于互联网,仅供个人研究和学习使用,请勿用于商业用途,下载后请于24小时内删除,请支持正版! 本文介绍Navicat Premium 12的安装.激活与基本使用.已于20 ...
- python day05
数字类型 1.整型:整数 num = 1000000000000 type(num) --->int 2.浮点型:小数 num = 123.2341 type(num) --->float ...