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

    策略模式

    定义:

    策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。(其实类似于if-else模式)

    设计原则:

    1.把变化的代码从不变的代码中分离出来
    2.针对接口编程而不是具体的类(定义了策略接口)
    3.多用组合,少用继承(客户端通过组合方式使用策略,用行为类组合,而不是行为的继承)
    4.对修改关闭,对扩展开放(符合开闭原则)
    原理是用多态实现的。

    适用场景:

    系统有很多类,它们的区别仅在于行为不同,一个系统需要动态地在几种算法中选择一种。

    组成:

    策略模式中包含三部分:
    策略(Strategy):策略是一个接口,该接口定义若干个算法标识,即定义了若干个抽象方法。
    具体策略(ConcreteStrategy):具体策略是实现策略接口的类,具体策略实现策略接口所定义的抽象方法,即给出算法标识的具体算法。
    上下文(Context):上下文是依赖于策略接口的类,即上下文包含有策略声明的变量。上下文中提供一个方法,该方法委托策略变量调用具体策略所实现的策略接口中的方法。

    优缺点:

    优点:符合开闭原则,增加程序的可扩展性和可维护性;避免多个if-else判断
    缺点:客户端必须知道所有策略类,并自行决定使用哪一个策略类;此外每增加一个策略就要增加一个类,类数目逐渐增多

    类图:

    Strategy接口定义了一个算法族,均实现了behavior()方法。
    Context是使用到该算法族的类,它的dosomething()方法会调用behavior(),setStrategy(Strategy)方法可以动态地改变strategy对象,即动态改变Context使用的算法。

    tip:

    一般情况下,策略模式会结合工厂模式或单例模式一起使用

    使用策略模式的源码:

    java.util.Comparator#compare()
    javax.servlet.http.HttpServlet
    javax.servlet.Filter#doFilter()
    Spring框架中的Resourse以及初始化接口InstantiationStrategy

    具体实现:

    //定义一个策略接口
    public interface  tmpStrategy{
        void quack();
    }
    
    //定义具体策略方法
    //普通鸭子呱呱叫算法
    public class IsQuack implements  tmpStrategy{
        @Override
        public void quack(){
            System.out.println("普通鸭子呱呱叫");
        }
    }
    //橡皮鸭子吱吱叫算法
    public class Squeak implements  tmpStrategy{
        @Override
        public void quack(){
            System.out.println("橡皮鸭子吱吱叫");
        }
    }
    //木头鸭子不会叫算法
    public class MuteQuack implements  tmpStrategy{
        @Override
        public void quack(){
            System.out.println("木头鸭子不会叫");
        }
    }
    
    //客户端调用算法
    public class Context {
        //注入策略接口以后,才可以选择策略。
        private tmpStrategy strategy;
    
        public Context(tmpStrategy strategy){
            this.strategy = strategy;
        }
    
        public void setQuackBehavior(){
            strategy.quack();
        }
    
        public static void main(String[] args) {
            System.out.println("guagua");
            Context context1 = new Context(new IsQuack());
            context1.setQuackBehavior();
    
            System.out.println("zhizhi");
            Context context2 = new Context(new Squeak());
            context2.setQuackBehavior();
    
            System.out.println("nono");
            Context context3 = new Context(new MuteQuack());
            context3.setQuackBehavior();
        }
    }
    
  • 相关阅读:
    这个Pandas函数可以自动爬取Web图表
    /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by /usr/local/python3.6/lib/python3.6/site-packages/paddle/fluid/core_avx.so)
    kubernetes yaml详解
    centos 安装kubernetes
    初识kafka-connect
    Docker1:本地连接Docker中的mysql,实现数据同步
    git分支管理规范
    cat 配置告警规则
    Java的即时编译(Just In Time, JIT)及其优化
    java自定义实现一个缓存器
  • 原文地址:https://www.cnblogs.com/yzhengy/p/13369098.html
Copyright © 2011-2022 走看看