设计模式(11)-策略模式详解(易懂)

作者: 秦子帅 | 来源:发表于2018-02-27 09:19 被阅读48次

    策略模式的定义

    策略模式比较简单,是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

    模型:

    image
    • Context:上下文角色,起到封装的作用,持有一个Strategy对象的引用

    • Strategy:策略角色(抽象) 通常为接口

    • ConcreteStrategy:具体的策略角色

    实例说明

    策略模式很好理解,这里拿百度网盘举例大家应该更明白了。比如现在的百度网盘普通的用户没有额外的空间,会员会额外的获得2T空间 ,而超级会员额外获得5T空间+各种福利。这也是一种策略,下面用代码演示一下:

    1.Strategy,抽象的策略,也就是获取的额外的空间

    
    public interface AbstractStrategy {
        //获取额外空间的方法
        public  void  getExSpace();
    }
    
    

    2.ConcreteStrategy,也就是普通用户,会员,超级会员

    
    public class OrdinaryUser implements AbstractStrategy{
    
        @Override
        public void getExSpace() {
            Log.d("qzs","普通用户没有额外的空间获取");
        }
    }
    
    
    
    public class Vip implements AbstractStrategy {
        @Override
        public void getExSpace() {
            Log.d("qzs","会员用户有2T额外的空间获取");
        }
    }
    
    
    
    public class SuperVip implements AbstractStrategy {
        @Override
        public void getExSpace() {
            Log.d("qzs","超级会员用户有5T额外的空间获取");
        }
    }
    
    

    3.Context,上下文,为了封装

    
    public class SpaceContext {
        private  AbstractStrategy abstractStrategy;
    
        public  SpaceContext(AbstractStrategy abstractStrategy){
            this.abstractStrategy=abstractStrategy;
        }
        //调用抽象策略角色中的方法
        public void getExSpace(){
            this.abstractStrategy.getExSpace();
        }
    }
    
    

    4.调用:

    
           SpaceContext spaceContext;
            //如果是普通用户
            spaceContext=new SpaceContext(new OrdinaryUser());
            spaceContext.getExSpace();
            //如果是会员
            spaceContext=new SpaceContext(new Vip());
            spaceContext.getExSpace();
            //如果是超级会员
            spaceContext=new SpaceContext(new SuperVip());
            spaceContext.getExSpace();
    
    

    运行结果:

    image

    策略模式的优缺点及其他

    1.优点

    • 策略模式提供了管理相关的算法族的办法,算法可以切换

    • 避免使用多重条件转移语句

    2.缺点

    • 客户端知道所有的策略类,并自行决定使用哪一个策略类。策略类完成暴露了

    • 策略类有时会非常多

    3.适用场景

    • 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。

    • 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。

    • 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

    强调:策略模式在Android中的应用比较典型是Adapter;另外还有策略枚举的应用大家感兴趣的可以自己看一下;具体的应用我会另外写一篇文章来讲。

    定义和优缺点参考网上信息


    另外可以加入我的Android技术交流群:458739310
    大家可以关注我的微信公众号:「安卓干货铺」一个有质量、有态度的公众号!

    相关文章

      网友评论

        本文标题:设计模式(11)-策略模式详解(易懂)

        本文链接:https://www.haomeiwen.com/subject/nakpxftx.html