策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
目录
- 概念以及核心图解,优缺点
- 策略模式在项目中实际应用场景
- 结语
正文开始
- 概念以及核心图解, 优缺点。
图一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);//踢足球
}
}
-
结语
设计模式只是一种思想, 用来区分代码的三六九等,用了即高级,没用也没错, 提高软件知识和技术只是问题的表面,本质是要提高自己认识问题、分析问题、解决问题的思想高度。
大量资料以及面试题,实战经验,详情可加