你们好,我是小赵,现任藏剑山庄高级铸剑师。算法
我铸的剑质量都属上层,不管是玄铁重剑、屠龙刀、紫薇软剑、三叉戟等等,只要江湖上排的上号的我几乎都能作的出来,因此在圈内还算是小有名气。设计模式
今天朋友给我介绍了个私活,雇主是欧阳锋,听说是想打造一把神兵利器。ide
“锋哥,讲一下你的需求吧。”函数
“华山论剑在即,我要当天下第一!”。this
“.......” spa
我感受这位峰哥是否是有点不正常,那干脆我来引导一下需求吧,因而我问道:“峰哥是否是想要一把绝世好剑?”设计
“不错,小伙子很懂我!就要一把绝世好剑!”code
几天以后,我打造出了这把绝世好剑:对象
public class JueShi { public void exec(){ System.out.println("装备绝世好剑!"); } }
使用简单,只须要调一下exec()方法就佩戴上了:blog
public static void main(String[] args) { System.out.println("----- 欧阳锋 -----"); JueShi jueShi = new JueShi(); jueShi.exec(); }
输出:
----- 欧阳锋 -----
装备绝世好剑!
峰哥高高兴兴拿着绝世好剑回去。
三天后,气呼呼来找我了。
“小赵!我这把绝世好剑,我拿去跟聂风打,跟岳不群打,都打赢了,怎么跟我干儿子打就打不赢!?”
“你干儿子?哪位啊?”
“杨过啊!”
我草,杨过用的是玄铁重剑,这把绝世好剑确定打不过人家,那可怎么办?那能怎么办?天下武器环环相克,不可能一把武器无敌天下。
我心生一计,马上说道:“峰哥,你看要不这样,你多打造几把神兵利器,实战中根据对手的不一样而更换不一样的武器,保准打遍天下无敌手。”
“好主意!我如今最忌惮的人就郭靖、洪七公、杨过三我的,郭靖用掌、洪七公用棍、杨过用剑,你只要保证我把这三个战胜就好了。”
生意谈好以后,就开始设计开发了。
个人策略很简单:
郭靖用掌,怕远程,那就用小李飞刀对付他。
洪七公用棍,选用倚天剑便可,削铁如泥又不失灵活。
杨过的玄铁重剑?一把屠龙刀砍翻他!
角色1:武器(小李飞刀、倚天剑、屠龙刀都是武器),也就是武器抽象和武器实体。
角色2:峰哥,咱们这里重点探讨策略,因此峰哥就不存在了,当成主函数便可。
动做:更换武器(也就是接收一个武器,而且佩戴)。
类图很是的简单:
几天后,峰哥来取剑。
武器抽象:
public interface IWeapon { void exec();//每把武器均可以佩戴 }
屠龙刀:
public class TuLong implements IWeapon{ @Override public void exec() { System.out.println("带上屠龙刀!"); } }
倚天剑:
public class Yitian implements IWeapon { @Override public void exec() { System.out.println("带上倚天剑!"); } }
小李飞刀:
public class XiaoLiFeiDao implements IWeapon { @Override public void exec() { System.out.println("带上小李飞刀!"); } }
上下文对象,负责维护对武器的引用:
public class Context { private IWeapon weapon; //传入一把武器 public Context(IWeapon weapon) { this.weapon = weapon; } //佩戴武器,分分钟秒杀你 public void exec(){ this.weapon.exec(); } }
主函数:
public static void main(String[] args) { System.out.println("华山论剑开始:"); System.out.println("------欧阳锋对郭靖------"); Context context1 = new Context(new XiaoLiFeiDao()); context1.exec(); System.out.println("------欧阳锋对洪七公------"); Context context2 = new Context(new Yitian()); context2.exec(); System.out.println("------欧阳锋对杨过------"); Context context3 = new Context(new TuLong()); context3.exec(); }
输出:
华山论剑开始:
------欧阳锋对郭靖------
带上小李飞刀!
------欧阳锋对洪七公------
带上倚天剑!
------欧阳锋对杨过------
带上屠龙刀!
华山论剑是二十年一度的江湖奥运会,各个电视台都在同步直播,在直播里,我看到了峰哥意气风发,遇神杀神,遇佛杀佛,最终得到了天下第一的称号。
给峰哥设计的这套程序,使用了策略模式,这是一个相对于比较简单的设计模式。
策略模式:它定义了算法家族,分别封装起来,让它们之间能够互相替换,此模式让算法的变化,不会影响到使用算法的客户。
策略模式的三个角色:
Context封装角色,也叫作上下文角色,起到封装做用,屏蔽高层模块对策略的直接访问。
策略抽象角色,让每一个策略实现的接口。
具体策略角色,实现抽象策略接口,并实现具体的算法内容。
策略模式的优势在于策略能够自由切换,而且扩展性很好,若是要增长一个新策略,只须要实现策略抽象接口便可。
当一个业务须要多种算法自由切换的时候,而且但愿屏蔽算法的具体内容,只须要调用一下即获取结果,则优先考虑策略模式。