策略模式项目中实际使用

 FusionCheck和CommonCheck是ILiveCheck的实现类,当我们需要使用这两个实现类的时候,使用LiveCheckWrapper里面传入相应的需要的实现类即可。

具体的代码结构如下图所示:

仿写的代码如下:

一个抽象策略接口:

public interface Strategy {
    int doOperation(int num1, int num2, Strategy.StrategyCallback callback);

    interface StrategyCallback {
        void onSuccess();
        void onFail();
    }
}

加减乘的三个具体实现:

public class OperationAdd implements Strategy {
    @Override
    public int doOperation(int num1, int num2, StrategyCallback callback) {
        if (num1 + num2 > 10) {
            callback.onFail();
            return 100;
        } else {
            callback.onSuccess();
            return num1 + num2;
        }
    }
}
public class OperationSubstract implements Strategy {

    @Override
    public int doOperation(int num1, int num2, StrategyCallback callback) {
        if (num1 - num2 < 0) {
            callback.onFail();
            return -1;
        } else {
            callback.onSuccess();
            return num1 - num2;
        }
    }
}
public class OperationMultiply implements Strategy {

    @Override
    public int doOperation(int num1, int num2, StrategyCallback callback) {
        if (num1 * num2 > 10) {
            callback.onFail();
            return 100;
        } else {
            callback.onSuccess();
            return num1 * num2;
        }
    }
}

针对上述三个实现的包装/封装转化,屏蔽外界的选择:

public class StrategyWrapper implements Strategy {

    private Strategy strategy;

    /**
     * 方式一调用:从外面传入行为策略
     *
     * @param strategy
     */
    public StrategyWrapper(Strategy strategy) {
        this.strategy = strategy;
    }

    public int executeStrategy(int num1, int num2, Strategy.StrategyCallback callback) {
        return strategy.doOperation(num1, num2, callback);
    }
    /**
     * 方式一调用:从外面传入行为策略
     */


    /**
     * 方式二调用:直接在里面判断策略选择
     */
    private int chooseWitch = 1;
    // getInstance 获取系统需要的取值策略

    public StrategyWrapper() {
        if (chooseWitch == 1) {
            strategy = new OperationAdd();
        } else if (chooseWitch == 2) {
            strategy = new OperationSubstract();
        } else {
            strategy = new OperationMultiply();
        }
    }

    @Override
    public int doOperation(int num1, int num2, StrategyCallback callback) {
        return strategy.doOperation(num1, num2, callback);
    }
    /**
     * 方式二调用 end
     */
}

外界的调用方式一,直接往策略包装类中传入需要的具体策略

StrategyWrapper wrapper = new StrategyWrapper(new OperationAdd());
StrategyWrapper wrapper = new StrategyWrapper(new OperationSubstract());
StrategyWrapper wrapper = new StrategyWrapper(new OperationMultiply());
public class computeManager {

    private void doDiffComputeStrategy() {
        /**
         * 方式一 begin:在这里选择使用的策略,方便不同策略回调不同结果
         */
        StrategyWrapper wrapper = new StrategyWrapper(new OperationAdd());
        wrapper.executeStrategy(1, 2, new Strategy.StrategyCallback() {
            @Override
            public void onSuccess() {

            }

            @Override
            public void onFail() {

            }
        });

    }
}

外界的调用方式二,不在初始策略中传,而是在包装类中进行选择:

public class computeManager2 {

    /**
     * 方式二 begin:不需要在这里选择使用的策略,方便不同策略回调后走相同的处理流程
     */
    private void doDiffComputeStrategy() {
        Strategy strategy = new StrategyWrapper();
        strategy.doOperation(1, 2, new Strategy.StrategyCallback() {
            @Override
            public void onSuccess() {
                System.out.println("manager 2 success");
            }

            @Override
            public void onFail() {
                System.out.println("manager 2 failed");
            }
        });
    }
}

整个项目在git上:https://github.com/buder-cp/DesignPattern/tree/master/mvp-rx-loginStrategy-master/strategymode

发布了189 篇原创文章 · 获赞 81 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/cpcpcp123/article/details/103275182