有需求,就会有满足需求的技术诞生,设计模式官方点讲,就是为了代码可重复性.让代码更容易被他人理解,保证代码的可靠性,通俗点讲,为了少写代码而多写代码,为了更好的"偷懒",呢到底是怎么"偷懒"的呢?分享下自己对23种模式中策略模式的理解
策略模式
如果需要我们写一个键盘录入的算法代码,怎么办?很简单
``
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println(“输入第一个值”);
int one = sc.nextInt();
System.out.println(“输入第二个值”);
int two = sc.nextInt();
System.out.println(“输入+,-,*”);
String str = sc.next();
if (str.equals("+")){
System.out.println("相加得:"+(one+two));
} else if (str.equals("-")){
System.out.println("相减得:"+(one-two));
} else if (str.equals("*")){
System.out.println("相减得:"+(one*two));
} else {
System.out.println("请输入正确标识");
}
}
这样子写并没有错,但是你有没有发现,如果需求增加了,我还想要加一个除法的运算,怎么办,只能在已经写好的类里面修改了,这就违背了开放封闭原则,写代码就像搭积木一样,再已经搭好的类里面修修改改,而且里面的逻辑都很相似,就很容易崩溃.怎么办呢?这时候就可以用到策略模式了
什么是策略模式?
它的定义是:
定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换.
主要就是为了解决:
在有多种算法相似的情况下,使用 if…else 带来的复杂和难以维护。
算法就好像三国杀里面的锦囊,无懈可击,顺手牵羊,南蛮入侵就是各种"算法",
而你就是客户端,也就是调用者,你是想有一张"万能牌",想它是什么就是什么呢,还是想手里拿一大堆卡牌呢?不仅不好找容易打错,还拿的累的慌;
呢想怎么获得这张"万能牌"呢?
代码如下:
创建一个接口,定义它是"锦囊"
public interface Kits {
//定义了"锦囊"的抽象功能.
public void userd();
}
定义接口的实体类,具体的"锦囊";也就是定义"万能牌"可以变化的牌
第一个锦囊牌–>南蛮入侵
public class KitsInvasion implements Kits {
//定义了"锦囊"的具体功能-->南蛮入侵.
@Override
public void userd() {
System.out.println("使用锦囊:南蛮入侵");
}
}
第二个锦囊牌–>顺手牵羊
public class KitsSteal implements Kits{
//定义了"锦囊"的具体功能-->顺手牵羊
@Override
public void userd() {
System.out.println("使用锦囊:顺手牵羊");
}
}
第三个锦囊牌–>无懈可击
public class KitsWatertight implements Kits {
//定义了"锦囊"的具体功能-->无懈可击
@Override
public void userd() {
System.out.println("使用锦囊:无懈可击");
}
}
//定义一个Context类,就是定义"万能锦囊牌"
public class Context {
//定义一个对象"锦囊"类的成员变量
private Kits kits;
//构造函数,用于给"锦囊写上名字"
public Context(Kits kits){
this.kits = kits;
}
//调用"写上名字"的锦囊的功能
public void userKits(){
kits.userd();
}
}
定义测试,调用者,也就是"你"
public class StrategyDemo {
public static void main(String[] args) {
//给锦囊"写上名字-->南蛮入侵"
Context contextOne = new Context(new KitsInvasion());
contextOne.userKits();
//给锦囊"写上名字-->顺手牵羊"
Context contextTwo = new Context(new KitsSteal());
contextTwo.userKits();
//给锦囊"写上名字-->无懈可击"
Context contextThree = new Context(new KitsWatertight());
contextThree.userKits();
}
}
这样子,"你"只需要拿一张牌,给锦囊"写上名字"就可以使用锦囊的功能了~
希望能对大家有所帮助.如果您有什么建议或者不明白的地方,还请在下方留言,大家一起解决,进步!