宅在家里太久了,我想出门溜达溜达!
1 选择出行方式:
1.天气挺好的,步行出门,慢慢悠悠美美哒!
2.骑上我心爱的小摩托,它永远不会堵车!
3.今天要相亲了,我要开着我的东风风神去压压场子!
…
2 传统的选择方案
使用if…else 或者switch case 选择不同的方案,如下代码
public class Method {
public static void main(String[] args) {
String method = "某种出行方式";
if("步行".equalsIgnoreCase(method)){
//todo
}else if("小摩托".equalsIgnoreCase(method)){
//todo
}else if("东风风神".equalsIgnoreCase(method)){
//todo
}else{
System.out.print("家里蹲");
}
}
}
2.1 存在的问题
我有钱了,买了辆飞机,或者太空船,那么这里的出行方式的代码就需要再次修改.这里的出行方式和调用出行动作的对象紧密耦合
3 策略模式
定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
出行方式接口
public interface IStrategy {
public void travelMode();
}
出行实现:
public class Walk implements IStrategy{
@Override
public void travelMode() {
System.out.print("天气挺好的,步行出门,慢慢悠悠美美哒!");
}
}
public class Motorcycle implements IStrategy{
@Override
public void travelMode() {
System.out.print("骑上我心爱的小摩托,它永远不会堵车!");
}
}
public class DongfengFengshen implements IStrategy{
@Override
public void travelMode() {
System.out.print("今天要相亲了,我要开着我的东风风神去压压场子!");
}
}
使用出行方式的人
public class AMan {
private IStrategy strategy;
public AMan(IStrategy strategy){
this.strategy = strategy;
}
public void travel(){
System.out.println("我要出门了:");
//根据strategy的具体实现类来选择出行方式
strategy.travelMode();
}
//这里定义set方法可以再运行是改变出行的行为
public void setStrategy(IStrategy strategy){
this.strategy = strategy;
}
}
现在要出门了:
public class Application {
public static void main(String[] args) {
AMan aman = new AMan(new Walk());
aman.travel();
aman.setStrategy(new Motorcycle());
aman.travel();
aman.setStrategy(new DongfengFengshen());
aman.travel();
}
}
如果后期需要新增出行方式,只需要实现对应的接口即可,出门的时候选择对应的出行方式即可.
4 小结
策略模式:分别封装行为接口,实现算法族,超类里放行为接口对象,在子类里具体设定行为对象。原则就是:分离变化部分,封装接口,基于接口编程各种功能。此模式让行为算法的变化独立于算法的使用者。
本文介绍了一种使用策略模式解决出行方式选择问题的方法。通过定义出行方式接口和具体实现类,实现了算法的相互替换,使得新增出行方式只需实现接口即可,提高了代码的扩展性和维护性。
1247

被折叠的 条评论
为什么被折叠?



