23种设计模式整理-策略模式

有需求,就会有满足需求的技术诞生,设计模式官方点讲,就是为了代码可重复性.让代码更容易被他人理解,保证代码的可靠性,通俗点讲,为了少写代码而多写代码,为了更好的"偷懒",呢到底是怎么"偷懒"的呢?分享下自己对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();
    }
}

这样子,"你"只需要拿一张牌,给锦囊"写上名字"就可以使用锦囊的功能了~

希望能对大家有所帮助.如果您有什么建议或者不明白的地方,还请在下方留言,大家一起解决,进步!

猜你喜欢

转载自blog.csdn.net/qq_42815122/article/details/84637890