设计模式-策略模式

194 阅读1分钟

策略模式

引言

今天家里买了点大闸蟹,弟弟想红烧吃,妹妹想清蒸吃,该如何是好呢?

正文

策略模式,就是将一系列功能类似的算法包装起来,使其可以相互替换,并且每种算法内部的改变并不会影响用户的调用。

核心思想

策略模式通过对不同的算法进行封装,从而达到算法的实现和调用相分离的目的,不同的算法只需要各自实现,环境类只需要在根据不同的情况调用不同的算法即可。

代码实现

讲解

抽象策略接口:

    public interface Strategy {
        public void strategyMethod();
    }

不同的算法:

    class StrategyA implements Strategy {

        @Override
        public void strategyMethod() {
            System.out.println("StrategyA");
        }
    }

    class StrategyB implements Strategy {
        @Override
        public void strategyMethod() {
            System.out.println("StrategyB");
        }
    }

环境类:

    class Context {
        private Strategy mStrategy;

        public Strategy getStrategy() {
            return mStrategy;
        }

        public void setStrategy(Strategy strategy) {
            this.mStrategy = strategy;
        }

        public void strategyMethod() {
            mStrategy.strategyMethod();
        }
    }

实例

//做螃蟹接口
public interface CookCrab {
    void cookCrab();
}
//红烧螃蟹
public class BraiseCrab implements CookCrab {
    @Override
    public void cookCrab() {
        System.out.println("红烧螃蟹哦~");
    }
}
//清蒸螃蟹
public class SteamCrab implements CookCrab {
    @Override
    public void cookCrab() {
        System.out.println("清蒸螃蟹哦~");
    }
}
//环境类
public class CrabContext {
    private CookCrab mCookCrab;

    public CookCrab getCookCrab() {
        return mCookCrab;
    }

    public void setCookCrab(CookCrab cookCrab) {
        this.mCookCrab = cookCrab;
    }

    public void startCookCrab() {
        mCookCrab.cookCrab();
    }
}
//调用
public class example {
    public static void main(String[] args) {
        //推荐写法
        CrabContext crabContext = new CrabContext();
        crabContext.setCookCrab(new BraiseCrab());
//        crabContext.setCookCrab(new SteamCrab());
        crabContext.startCookCrab();
    }
}

总结

策略模式将实现和调用进行分离,从而可以对每种算法进行更有效的管理。同时由于其对开闭原则的良好支持,它可以在不修改原来代码的情况下,增加新的算法。但在使用策略模式之前,需要对不同的算法都要有所了解,才能更好的理解其异同并选择合适的算法。