设计模式-策略模式

策略模式:对于同一个行为,当实施行为的对象发生变化时,具体的实现方式也跟着变化。

直接举个例子:比如公司要举行年会了,组织者设计了一个活跃气氛的环节,做个小游戏,但是做什么游戏不确定,就提前准备了好几个游戏,至于具体做哪个到时候现场决定。

年会的其他流程都是可以确定的,我们就正常实现即可,游戏这里不确定,而不同的游戏他们的内容是不同的,所以游戏这部分就用策略模式来实现。

首先需要一个游戏的抽象和准备几个具体的游戏:

给每个游戏一个类型,以便于使用的时候找到对应的对象

public abstract class Game {
    protected String type;

    public abstract void play();
}
// 抢凳子
public class Qiangdengzi extends Game{

    public Qiangdengzi() {
        this.type = "Q";
    }

    @Override
    public void play() {
        System.out.println("游戏:大家一起抢凳子,人越多越好玩");
    }
}

//你画我猜
public class Nihuawocai extends Game{

    public Nihuawocai() {
        this.type = "N";
    }

    @Override
    public void play() {
        System.out.println("游戏:你画我猜,心有灵犀");
    }
}

年会的流程:

public class YearMeeting {

    // 这里模拟实际生产中,程序加载时把所有对象都创建出来并缓存起来
    private static  Map<String, Game> gameMap = new HashMap<>();
    static {
            gameMap.put("N", new Nihuawocai());
            gameMap.put("Q", new Qiangdengzi());
    }

    // 年会的流程
    public void meeting(String type){
        // 其他业务逻辑
        System.out.println("年会开始了");
        System.out.println("领导讲话了");
        // 策略行为的逻辑,先获取对应的对象,对象不同,行为逻辑不同
        Game game = gameMap.get(type);
        game.play();
        System.out.println("年会结束了");
    }
}

测试:

public class Client {
    public static void main(String[] args) {
        YearMeeting yearMeeting = new YearMeeting();
        // 具体的策略行为要到程序运行之中才能确定
        yearMeeting.meeting("Q");
//        yearMeeting.meeting("N");
    }
}

小结一下:策略模式在开发中应该是挺常用的,它主要可以解决代码中大量的if-else的问题。而且还有很好的扩展性。当我们需要添加新的策略时,直接实现具体的策略即可。在使用策略的地方完全不用修改。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容