什么是策略模式
现在有一个朋友如下,会阅读、驾驶,如果想要增加或修改原来会的技能,就必须要去操作你的朋友,可能会导致的结果是朋友会被改的臃肿且面目全非
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BeforeFriend {
private String name;
private int age;
public void drive(){
System.out.println("drive");
}
public void read(){
System.out.println("read");
}
}
而策略模式在这个场景下就是瘦身神器,只需要朋友掌握技能管理器,让技能管理器加载技能即插即用,缺点就是技能可能会随着时间越来越多
重新定义朋友如下,让其掌握技能管理器
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Friend {
private String name;
private int age;
private SkillManager skillManager;
public void getSkill(){
this.skillManager.getSkill();
}
}
创建技能管理器如下
public interface SkillManager {
void getSkill();
}
实现具体的技能
public class DriveSkill implements SkillManager {
@Override
public void getSkill() {
System.out.println("drive");
}
}
public class ReadSkill implements SkillManager {
@Override
public void getSkill() {
System.out.println("read");
}
}
当完成以上三步后,我们的朋友就变成了
public static void main(String[] args) {
Friend friend = new Friend();
DriveSkill drive = new DriveSkill();
//加载驾驶技能
friend.setSkillManager(drive);
friend.getSkill();
ReadSkill read = new ReadSkill();
//加载阅读技能
friend.setSkillManager(read);
friend.getSkill();
}
可以明显看出,如果想在BeforeFriend中新增或修改技能,就需要对BeforeFriend进行侵入式修改,而在Friend中增加实现SkillManager接口的类即可,就实现了对Friend的无侵入式增强,更灵活且更具拓展性
换成专业术语描述,将类(Context)中公共且可能经常修改的内容提取抽象为策略接口(Strategy),类持有策略接口实例,基于多态在类的实例中即可调用实现了策略接口的具体策略类(ConcreteStrategy),缺点是具体策略类会随着业务的拓展和时间的推移越来越多