一个男人的设计模式:出行也要妥妥的(策略模式)

宅在家里太久了,我想出门溜达溜达!

选择出行方式:

1.天气挺好的,步行出门,慢慢悠悠美美哒!
2.骑上我心爱的小摩托,它永远不会堵车!
3.今天要相亲了,我要开着我的东风风神去压压场子!

传统的选择方案

使用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("家里蹲");
        }
    }
}

存在的问题

我有钱了,买了辆飞机,或者太空船,那么这里的出行方式的代码就需要再次修改.这里的出行方式和调用出行动作的对象紧密耦合

策略模式

定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

出行方式接口

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();

    }
}

如果后期需要新增出行方式,只需要实现对应的接口即可,出门的时候选择对应的出行方式即可.

总结

策略模式:分别封装行为接口,实现算法族,超类里放行为接口对象,在子类里具体设定行为对象。原则就是:分离变化部分,封装接口,基于接口编程各种功能。此模式让行为算法的变化独立于算法的使用者。

你可能感兴趣的:(java设计模式)