一、例子

令狐冲被岳不群罚在思过崖上面壁思过。偶然的机会发现崖内有一个后洞,石壁上刻有魔教十长老尽破五岳剑派的图形招式。所有五岳剑派引以为豪的精微奥妙招式尽数被破得干干净净,包括一些已经失传的招式。

有一天采花大盗田伯光上思过崖来找令狐冲,让令狐冲随他下崖去见仪琳。仪琳思念令狐冲,她老爹不戒和尚点了田伯光死穴喂了毒药逼他把令狐冲带到仪琳面前以解仪琳相思之苦,若一月之内拿不到解药,就无药可救了。他必须要把令狐冲带下崖去,令狐冲死活不去。师父师娘为了田伯光在长安附件做了几起大案,影响到华山派声誉,已下山去诛杀田伯光。

当时令狐冲手上功夫和内力轻功等都远不如田伯光。田伯光用激将法引得令狐冲和他打了一个赌,如果令狐冲能接他三十招,他拍拍屁股走人,从此再也不让令狐冲随他下崖,如果接不了三十招,令狐冲就乖乖跟他走。

不管令狐冲用本门剑法还是从石壁上现学现卖的衡山、恒山、嵩山、泰山剑法都接不了田伯光三十招。后来华山派的归隐高手风清扬看得兴起,指点了令狐冲几句,先使一招‘白虹贯日’,跟着便使‘有凤来仪’,再使一招‘金雁横空’,接下来使‘截剑式’…将华山剑法打乱顺序来使,剑术之道,讲究如行云流水,任意所至,中间剑招不连贯的地方可以别出心裁,随手配合,一切须当顺其自然,行乎其不得不行,止乎其不得不止,中间不可有半点勉强。这一指点,令狐冲登时就接了田伯光一百多招,后来再经风清扬传授几招独孤九剑,田伯光就再也不是对手了。

接下来用代码实现令狐冲和田伯光比武的场景,令狐冲中间换了好几门剑法和田伯光比试。先来定义一个功夫的接口,令狐冲用到的剑法类以及田伯光用到的刀法类要实现此接口。

/*** 功夫的接口,两个方法,包括这门功夫的* 进攻方式和这门功夫的威力**/
public interface IKungfu {//攻击方式void attack();//威力(1~10代表威力等级)int power();}

功夫的接口IKungfu有两个方法,一个是功夫的招式,它的攻击方式attack,以及这门功夫的威力power,威力共分十个等级,数字越大,威力越大。

令狐冲用到了华山剑法,写一个华山剑法的类HuaShanSword实现功夫接口:

/*** 华山派剑法**/
public class HuaShanSword implements IKungfu{@Overridepublic void attack() {System.out.println("使出华山剑法");}@Overridepublic int power() {return 5;}}

华山剑法的威力为5。令狐冲又用到了嵩山剑法,写一个嵩山剑法的类SongShanSword实现功夫接口:

/*** 嵩山派剑法**/
public class SongShanSword implements IKungfu {@Overridepublic void attack() {System.out.println("使出嵩山剑法");}@Overridepublic int power() {return 6;}}

华山剑法的威力为6。后来,风清扬又传授了令狐冲在那时候天下无敌的独孤九剑,写一个独孤九剑的类NineSwordsOfDugu 实现功夫接口:

/*** 独孤九剑**/
public class NineSwordsOfDugu implements IKungfu {@Overridepublic void attack() {System.out.println("使出独孤九剑");}@Overridepublic int power() {return 10;}}

独孤九剑的威力最大,等级最高,为10。田伯光用到的刀法类TianBoGuangSword同样实现:

/*** 泰山派剑法* @author Administrator**/
public class TianBoGuangSword implements IKungfu{@Overridepublic void attack() {System.out.println("使出田伯光刀法");}@Overridepublic int power() {return 7;}}

田伯光的快刀威力(7)比令狐冲使出来的华山剑法(5)和嵩山剑法(6)威力还大。

相关的功夫接口和类实现完了,接下来需要定义使用这些剑法刀法的侠客的类了:

/*** 侠客**/
public class Swordsman {private String name;//侠客的名字private IKungfu kungfu;//侠客用到的功夫private Swordsman opponent;//侠客的对手public Swordsman(String name, IKungfu kungfu) {this.name = name;this.kungfu = kungfu;}//侠客和对手比武public void fightWith(Swordsman swordsman) {this.opponent = swordsman;System.out.print(name+":");this.kungfu.attack();System.out.print(swordsman.name+":");swordsman.kungfu.attack();fightResult();}//侠客与对手比武的结果private void fightResult() {if (this.kungfu.power() > opponent.kungfu.power()) {System.out.println("比武结果:"+name+"赢了!"+opponent.name+"输了!");} else if(this.kungfu.power() < opponent.kungfu.power()) {System.out.println("比武结果:"+name+"输了!"+opponent.name+"赢了!");} else{System.out.println("比武结果:"+name+"和"+opponent.name+"打平了!");}}//比武时可以更换用到的功夫public void replaceKungfu(IKungfu kungfu) {this.kungfu = kungfu;}}

这个类有两个public方法,一个是和对手比武的方法fightWith,以及比武时更换用到的功夫的方法replaceKungfu。

功夫和侠客都已经有了,下面就让令狐冲和田伯光在思过崖(SiGuoYa)上开始比试了:

public class SiGuoYa {public static void main(String[] args) {//令狐冲出场Swordsman lingHuChong = new Swordsman("令狐冲", new HuaShanSword());//田伯光出场Swordsman tianBoGuang = new Swordsman("田伯光", new TianBoGuangSword());//第一回合,令狐冲用本门剑法(华山剑法)和田伯光的刀法比试System.out.println("-----第一回合-----");lingHuChong.fightWith(tianBoGuang);System.out.println("\n-----第二回合-----");//第二回合,令狐冲换嵩山剑法和田伯光比试lingHuChong.replaceKungfu(new SongShanSword());lingHuChong.fightWith(tianBoGuang);System.out.println("\n-----第三回合-----");//第三回合,令狐冲换独孤九剑与田伯光比试lingHuChong.replaceKungfu(new NineSwordsOfDugu());lingHuChong.fightWith(tianBoGuang);}}

下面是他们的比武结果:

-----第一回合-----
令狐冲:使出华山剑法
田伯光:使出田伯光刀法
比武结果:令狐冲输了!田伯光赢了!

-----第二回合-----
令狐冲:使出嵩山剑法
田伯光:使出田伯光刀法
比武结果:令狐冲输了!田伯光赢了!

-----第三回合-----
令狐冲:使出独孤九剑
田伯光:使出田伯光刀法
比武结果:令狐冲赢了!田伯光输了!

再来整体上看看上面场景的类图:

二、策略模式

上面就是一个策略模式的例子。

策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

策略模式特意将算法与其他部分分离开来,只是定义了与算法相关的接口,然后再在程序中以委托的方式来使用算法。使用委托这种弱关联关系可以很方便地整体替换算法。在上面的例子中功夫IKungfu就是一个算法的接口,华山剑法HuaShanSword、嵩山剑法SongShanSword、独孤九剑NineSwordsOfDugu等是功夫IKungfu接口的具体实现,在令狐冲和田伯光的比试中,令狐冲可以很方便地切换武功,华山、嵩山、衡山、恒山、泰山五岳剑派的剑法以及风清扬传授的独孤九剑可以随意切换。

Java设计模式之——策略模式(Strategy)相关推荐

  1. Java设计模式之策略模式与状态模式

    一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...

  2. Java设计模式之策略模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  3. Java设计模式之策略模式+工厂模式+模板模式

    Java设计模式之策略模式+工厂模式+模板模式 1.策略模式+工厂模式+模板模式 个人的理解:实际开发工程中,一些业务很复杂的逻辑使用很多的 if 或者 if···else 语句,不利于维护和扩展,为 ...

  4. Java 设计模式之策略模式

    一.了解策略模式 1.1 什么是策略模式 策略模式 (Strategy Pattern) 是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换.此模式让算法的变化独立于使用算法的客 ...

  5. java解决策略膨胀_折腾Java设计模式之策略模式

    简介 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式.简单理解就是一组算法,可以互换,再简单点策略就是封装算法. 意图 定义一 ...

  6. 锈才学设计模式之 —— 策略模式(Strategy Pattern)

    锈才学设计模式之  -- 策略模式 策略模式:把功能提供者单独封装成类,使它们可以互相替换使用,让功能提供者独立于使用者(调用者). 说明: 在面向对象编程中,我们尽量将功能(类)设计成复用,以符合O ...

  7. 8.6 GOF设计模式四: 策略模式… Strategy Pattern

    策略模式- Strategy Pattern  在POS系统中,有时需要实行价格优惠, 该如何处理?  对普通客户或新客户报全价  对老客户统一折扣5%  对大客户统一折扣10%  注:课件 ...

  8. 二十四种设计模式:策略模式(Strategy Pattern)

    策略模式(Strategy Pattern) 介绍 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例 有一个Message实体类,对它的操 ...

  9. Java 设计模式之策略模式(Strategy Pattern)

    策略模式将程序的不变部分保留,可变部分单独拿出,然后封装起来,让今后此功能的扩展和修改更加方便. 此策略强调使用组合而非继承. 案例: 我们想模拟两种鸭子: 普通鸭, 橡胶鸭 我们知道这三种鸭子不可变 ...

最新文章

  1. leetcode算法题--最长公共前缀
  2. 原子设计_您需要了解的有关原子设计的4件事
  3. js中常用的日期处理函数
  4. [PyTorch] 官网教程之神经网络
  5. sql server 与 oracle 的不同,第一感觉。
  6. enable pen pressure in ps
  7. 第八章 linux磁盘与文件系统管理g
  8. 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
  9. 启用IIS服务(运行中输入inetmgr打不开IIS管理器的解决办法)
  10. Ubuntu安装Jenkins
  11. 魔兽世界单机mysql修改怪物血量_魔兽世界单机版如何修改怪物掉落物品个数
  12. php远程控制代码,内部网络机器的远程控制软件UltraVNC及其源代码
  13. python经济学函数_用python学习中级微观经济学【Slutsky Equation篇】
  14. SpringBoot+MyBatis+MySql实现的医院管理系统
  15. Vue项目中个人中心头像的上传方法
  16. 关于仙童八叛徒(转)
  17. 软硬件解耦太难!英伟达竟“越来越像Mobileye”
  18. JDK1.8 or JDK8傻傻分不清楚
  19. Hexo+buttterfly适合任意主题美化(悬挂动态修饰物)
  20. 兄弟3150cdn灯亮error_兄弟3150cdn彩色打印机一直显示红灯

热门文章

  1. 实现用户登录与用户注册的思路
  2. 安装完固态硬盘后计算机里没显示,如何解决安装固态硬盘后系统看不到的问题[详细介绍]...
  3. 【总结】Go 学习路线(2022)
  4. Python Crash Course读书笔记 - 第19章:USER ACCOUNTS
  5. ubuntu18.04未发现wifi适配器,安装wifi无线网卡驱动-RTL8822BE、RTL8822CE、RTL8821CE、RTL8723DE
  6. 好好说话之Large Bin Attack
  7. 360 os3.0 android7.1,360OS 3.0系统
  8. matlab中怎么正弦计算,matlab计算结果中的正弦余弦问题
  9. Pdf 插入图片 | 指定位置插入图片 不改变原格式 直接操作
  10. Echarts - legend、tooltip、xAxis属性设置