设计模式(二) 策略模式Strategy
策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,我个人的理解是,具有相同行为不同的行为模式,比如走路,有人速度3m/s,有人100m/s,把他们的具体行走和对象本身走路的行为分开,这样即使行走的算法变了,只要改改算法类,对象类就不用改了。
我们还是玩红警,现在已经造好了我们的战车工厂PanzerFactory,有两个坦克灰熊坦克BearPanzer和光棱坦克EdgelightPanzer在工厂里等待临幸。
这两个坦克都是可以移动的,现在假设我们的坦克可以攻击和防守(我记得好像兵才有这个功能,算啦,懒得再写类了),先在我们给他们点上攻击和防守的技能点。
把攻击抽象出一个接口
public interface PanzerStrategy {
public void doAction();
}
让我们的坦克具有这两种行为
public class Panzer {
protected String name;
//加入一个策略类对象
protected PanzerStrategy panzerStrategy;
public void move(){
System.out.println(name+"移动了!");
}
//具体行为方法
protected void doAction(){
System.out.print(name);
panzerStrategy.doAction();
}
}
public class BearPanzer extends Panzer{
public BearPanzer(PanzerStrategy panzerStrategy){
this.panzerStrategy=panzerStrategy;
name="灰熊坦克";
System.out.println(name+"制造完成");
}
}
public class EdgelightPanzer extends Panzer {
public EdgelightPanzer(PanzerStrategy panzerStrategy){
this.panzerStrategy=panzerStrategy;
name="光棱坦克";
System.out.println(name+"制造完成");
}
}
还有战车工厂,目前的游戏模式,一个坦克出来的时候他有个默认的使命,攻击或者防守
public class PanzerFactory {
public PanzerFactory() {
System.out.println("战车工厂造好了");
}
public Panzer createPanzer(String panzerName,PanzerStrategy panzerStrategy){
Panzer panzer=null;
switch (panzerName) {
case "灰熊坦克":
panzer=new BearPanzer(panzerStrategy);
break;
case "光棱坦克":
panzer=new EdgelightPanzer(panzerStrategy);
break;
default:
break;
}
return panzer;
}
}
现在又可以开一盘啦,这次我们造10个坦克,让灰熊守家,光棱去纵横驰骋
public class RedAlert {
public static void main(String[] args) {
System.out.println("开局......");
PanzerFactory factory=new PanzerFactory();
System.out.println("开始造坦克");
Panzer[] panzer=new Panzer[10];
//这个就是我们的两种指令
PanzerStrategy attackStratege=new AttackStratege();
PanzerStrategy defenseStratege=new DefenseStratege();
for (int i = 0; i <5; i++) {
panzer[i]=factory.createPanzer("灰熊坦克",defenseStratege);
}
for (int i = 5; i <10; i++) {
panzer[i]=factory.createPanzer("光棱坦克",attackStratege);
}
for (Panzer p : panzer) {
p.doAction();
}
System.out.println("YOU WIN!");
}
}

思考时间:策略模式是怎么个思路,有什么好处?
策略模式是把某一行为具体的算法封装到一系列类中,具有这一行为的对象类具有这些算法类,行为类调用行为函数时,只需要调用内部拥有的算法类的方法即可。
好处是如果需要修改或者增加,只要增加或者修改对应的算法类就可以,不必修改行为类,耦合度大大降低。
设计模式(二) 策略模式Strategy的更多相关文章
- 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)
原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...
- 二十四种设计模式:策略模式(Strategy Pattern)
策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有 ...
- 反馈法学习设计模式(一)——策略模式Strategy Pattern
简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...
- JAVA设计模式之策略模式 - Strategy
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...
- 8.6 GOF设计模式四: 策略模式… Strategy Pattern
策略模式… Strategy Pattern 在POS系统中,有时需要实行价格优惠, 该如何处理? 对普通客户或新客户报全价 对老客户统一折扣5% 对大客户统一折扣10% 注:课件 ...
- [设计模式] 21 策略模式 Strategy
在GOF的<设计模式:可复用面向对象软件的基础>一书中对策略模式是这样说的:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.该模式使得算法可独立于使用它的客户而变化. 策略模 ...
- 大熊君说说JS与设计模式之------策略模式Strategy
一,总体概要 1,笔者浅谈 策略模式,又叫算法簇模式,就是定义了不同的算法,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 策略模式和工厂模式有一定的类似,策略模式相对简单容易理解,并 ...
- 设计模式之策略模式Strategy
/** * 策略设计模式 * 策略模式:定义一系列的算法族,使他们之间可以相互转换,动态的改变其行为. * 问题:设计一个鸭子模拟游戏. * 现在有一群鸭子: * ①这些鸭可以有飞的行为(分为快和慢) ...
- 大话设计模式之策略模式(strategy)
策略模式:它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响使用算法的用户. 针对商城收银模式,打折,返现促销等的例子: 打折还是促销其实都是一些算法,可以用工厂模式来 ...
- 设计模式 笔记 策略模式 Strategy
//---------------------------15/04/28---------------------------- //Strategy 策略模式----对象行为型模式 /* 1:意图 ...
随机推荐
- Xmanager连接到RedHat Enterprise Linux 6.8
RedHat Enterprise Linux 6 配置Xmanager ,实现图形界面连接 X是用在大多数UNIX系统中的图形支持系统.如果你在你的Linux机器上使用GNOME或者KDE的话,你就 ...
- Zookeeper:分布式程序的基石
一.目录 1.zookeeper是什么? 2.安装.配置.启动.监控 3.javaApi基础用法 4.应用场景 5.CAP理论/paxos算法 二.zookeeper简介 官方版:zookeeper是 ...
- java亿级流量电商详情页系统的大型高并发与高可用缓存架构实战视频教程
亿级流量电商详情页系统的大型高并发与高可用缓存架构实战 完整高清含源码,需要课程的联系QQ:2608609000 1[免费观看]课程介绍以及高并发高可用复杂系统中的缓存架构有哪些东西2[免费观看]基于 ...
- 推荐几款.NET客户端开源报表图
如果你正在开发客户端报表图相关的应用,除了.NET自带的控件,你还可以考虑使用以下几个控件库. [OxyPlot] OxyPlot是一个支持.NET的跨平台绘图库.你可以在很多平台上使用它,如WPF, ...
- Handlebars.js 模板引擎
介绍 Handlebars 是 JavaScript 一个语义模板库,通过对view和data的分离来快速构建Web模板.它采用"Logic-less template"(无逻辑模 ...
- Vulkan Tutorial 25 Images
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 到目前为止,几何图形使用每个顶点颜色进行着色处理,这是一个 ...
- Exception in thread "main" java.lang.NoClassDefFoundError: javax/transaction/Synchronization
解决办法:原因是缺少jta.jar包,添加jta.jar包就好
- JAVA - 深入JAVA 虚拟机 1
Java虚拟机与程序的生命周期 Java虚拟机将结束生命周期 1.call System.exit(n) Terminates the currently running JVM. 2.程序正常执行结 ...
- Spring MVC 表单验证
1. 基于 JSR-303(一个数据验证的规范): import javax.validation.constraints.Min; import javax.validation.constrain ...
- 关于SurfaceView的那些事
今天来说说SurfaceView吧 这东西的特性大家记住一个就行了,它的绘制是在子线程中,所以不堵塞UI,非常适合一些复杂的绘制 SuufaceView有一个重要的对象,是SurfaceHolder, ...