zoukankan      html  css  js  c++  java
  • 策略模式

    策略模式的定义:
    Define a family of algorithms, encapsulates each one, and make them interchangeable.
    定义一组算法,将每个算法都封装起来,并且使它们之间可以互换

    策略模式三个角色:
    Context封装角色:上下文角色,起承上启下的作用,屏蔽高层模块对策略,算法的直接访问,封装可能存在的变化
    Strategy抽象策略角色:策略,算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。
    ConcreteStrategy具体策略角色:

    //抽象的策略角色
    public interface Strategy{
        public void doSomething();
    }
    
    //具体处理角色
    public class ConcreteStrategy1 implements Strategy{
        public void doSomething(){
            //.....
        }
    }
    public class ConcreteStrategy2 implements Strategy{
        public void doSomething(){
            //.....
        }
    }
    //策略模式的重点在于封装角色,它是借用了代理模式的思路
    //差别在于策略模式的封装角色和被封装策略类不用同一个接口
    //如果是同一接口就成了代理模式
    //封装角色
    public class Context{
        private Strategy strategy=null;
        public Context(Strategy _strategy){
            this.strategy=_strategy;
        }
        public void doAnything(){
            this.strategy.doSomething();
        }    
    }
    //高层模块的调用就是实例对应的策略类的对象,然后将其放到封装角色中
    public class Client{
        public static void main(String[] args){
            Strategy strategy=new ConcreteStrategy1();
            Context context=new Context(strategy);
            context.doAnything();
        }
    }

    优点:
    1.算法可以自由切换:只要实现了抽象策略,它就成为策略家族的一个成员,通过封装角色对其进行封装,保证对外提供“可自由切换”的策略
    2.避免使用多重条件判断:
    3.扩展性良好
    缺点:
    1.策略类数量增多:每一个策略都是一个类,复用的可能性很小,类数量增多
    2.所有的策略类都需要对外暴露:上层模块必须知道有哪些策略,然后才能决定使用哪个策略
    使用场景:
    1.多个类只有在算法或行为上稍有不同的场景
    2.算法需要自由切换的场景
    3.需要屏蔽算法规则的场景
    策略模式的注意事项:如果一个系统中的一个策略家族的具体策略数量超过4个,就要考虑使用混合模式
    ,解决策略类膨胀和对外暴露的问题,否则日后的系统维护难度就会增加。

  • 相关阅读:
    【程序员面试宝典】第五章 程序设计基本概念
    win7打开或关闭windows功能 提示“出现错误,并非所有的功能被更改”,管理员权限惹的祸
    堆排序
    目态与管态的概念
    循环不变式的概念
    getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析
    java算法 -- 冒泡排序
    Java算法 -- 二分查找
    Sql知识点总结
    java实现 链表反转
  • 原文地址:https://www.cnblogs.com/liaojie970/p/5488613.html
Copyright © 2011-2022 走看看