天天看点

设计模式之策略模式(实战+大白话)目录

策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

目录

  • 概念以及核心图解,优缺点
  • 策略模式在项目中实际应用场景
  • 结语

正文开始

  • 概念以及核心图解, 优缺点。
    review之前写的代码, 发现两大问题,分别举出反例
     第一:代码中if-else使用及其频繁。(图一)
     第二:整体的代码结构十分混乱,毫无美感可言。
     (后期会讲述领域驱动设计DDD,一个程序员不会DDD,基本可以淘汰了)。(图二,负面教材截图)
               
    设计模式之策略模式(实战+大白话)目录
    图一
设计模式之策略模式(实战+大白话)目录

图二

并不是说不用if-else,if-else用多了,会出现优先级等其他问题(具体问题具体分析),为了提升代码的可阅读性和美观,建议少用。策略模式的重心不是为了装高级,而是让程序结构更灵活,具有更好的维护性和扩展性。策略模式本质也是平等性,唯一性代表,最大的优点是代码可读性极高,自我感觉只要不刻意去用,就没啥缺点。一般出现重复(4个以上)连续if,建议使用。

策略模式三要素

具体实施的角色和行为:高级方法,列如:我今天去球馆打篮球。

抽象策略(strategy)角色:球馆,一般是接口

环境角色:长方形,是接口的实现类,可以是多个。篮球,足球,足球等其他球

  • 策略模式在项目中实际应用场景
    • 普通教学

      篮球类

public class Basketball {
    public void playBasketball(String param) {
        System.out.println("打篮球" + param);
    }
}
           

足球类

public class Football {
    public void playFootball(String param) {
        System.out.println("踢足球" + param);
    }
}
           

乒乓球类

public class PingPong {
    public void playPingPong(String param) {
        System.out.println("打乒乓球" + param);
    }
}
           

枚举类

enum ShareType {
    BASKBALL(1, "篮球"),
    FOOTBALL(2, "足球"),
    PINGPONG(3, "乒乓球");
    /**
     * 场景对应的编码
     */
    private Integer code;
    /**
     * 业务场景描述
     */
    private String desc;
}
           

主类

public class ShareFactory {
    public static void main(String[] args) throws Exception {
        Integer shareType = 1;
        if (shareType.equals(ShareType.BASKBALL.getCode())) {
            Basketball basketball = new Basketball();
            basketball.playBasketball("篮球");
        } else if (shareType.equals(ShareType.FOOTBALL.getCode())) {
            Football football = new Football();
            football.playFootball("足球");
        } else if (shareType.equals(ShareType.PINGPONG.getCode())) {
            PingPong pingPong = new PingPong();
            pingPong.playPingPong("乒乓球");
        } else {
            throw new Exception("未知球类型");
        }
    }
}
           
  • 高级教学

    球馆(抽象策略)

public interface BallHome{
    /**
     * 定义分享策略执行方法
     *
     * @param param
     */
    void play(String param);
 }
           

篮球

public class Basketball implements BallHome{
    @Override
    public void play(String param) {
        System.out.println("我是篮球中的param:"+param);
    }
}
           

足球

public class FootBall implements BallHome{
    @Override
    public void play(String param) {
        System.out.println("我是足球中的param:"+param);
    }
}
           

乒乓球

public class PingPong implements BallHome{
    @Override
    public void play(String param) {
        System.out.println("我是乒乓球中的param:"+param);
    }
}
           

枚举类

enum ShareType {
    BASKBALL(1, "篮球"),
    FOOTBALL(2, "足球"),
    PINGPONG(3, "乒乓球");
    /**
     * 场景对应的编码
     */
    private Integer code;
    /**
     * 业务场景描述
     */
    private String desc;
}
           

主类

public class ShareFactoryMain {
    /**
     * 小tips:
     *      被static修饰符修饰以后, 属于类变量, 类方法, 共享数据, JVM启动只需要加载一次即可。
     *      被final修饰符修饰对象, 可修改对象内容, 但不能new一个新对象.
     */
    private static final Map<String, ShareStrategy> map = new HashMap<>();

    static {
        map.put("basketball", new Basketball());
        map.put("football", new Football());
        map.put("pingpong", new PingPong());
    }
    /**
     * 多态tips:
     *     父类引用指向子类对象:BallHome p = new Child();// Child可以是Basketball,Football,Pingpong
     *      当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;
     *      如果有,再去调用子类的同名方法。
     *  多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
     */
    private static BallHome getBall(String param) {
        if (map.containsKey(param)) {
            BallHome ballhome = map.get(param);
            return ballhome;
        }
        throw new IllegalStateException("当前对象不存在");


    }

    public static void main(String[] args) {
        String str = "basketball";
        BallHome ballhome = getBall(str);
        ballhome.play(str);//踢足球
    }
}

           
  • 结语

    设计模式只是一种思想, 用来区分代码的三六九等,用了即高级,没用也没错, 提高软件知识和技术只是问题的表面,本质是要提高自己认识问题、分析问题、解决问题的思想高度。

大量资料以及面试题,实战经验,详情可加

设计模式之策略模式(实战+大白话)目录