• 设计模式之策略模式


    设计模式之策略模式

    什么是策略模式?

    策略模式定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。

    UML

    下面用具体代码来解释该模式

    首先定义所有支持的算法的公共接口,Strategy接口

    package strategy;
    
    public interface Strategy {
        void algorithmInterface();
    }

    其次定义封装了具体算法或行为接口实现类ABC

    package strategy;
    
    public class ConcreteStrategyA implements Strategy {
    
        @Override
        public void algorithmInterface() {
            // TODO Auto-generated method stub
            System.out.println("A");
        }
    
    }
    package strategy;
    
    public class ConcreteStrategyB implements Strategy {
    
        @Override
        public void algorithmInterface() {
            // TODO Auto-generated method stub
            System.out.println("B");
        }
    
    }
    package strategy;
    
    public class ConcreteStrategyC implements Strategy {
    
        @Override
        public void algorithmInterface() {
            // TODO Auto-generated method stub
            System.out.println("C");
        }
    
    }

    接着定义一个Context上下文,用一个具体的ConcreteStrategy来配置,维护一个对Strategy对象的引用

    package strategy;
    
    public class Context {
        Strategy strategy;
        public Context(Strategy strategy) {
            // TODO Auto-generated constructor stub
            this.strategy=strategy;
        }
        public void contextInterface() {
            strategy.algorithmInterface();
        }
    }

    最后就是定义Test测试类了

    package strategy;
    
    public class Test {
        public static void main(String[] args) {
            Context contextA=new Context(new ConcreteStrategyA());
            contextA.contextInterface();
            Context contextB=new Context(new ConcreteStrategyB());
            contextB.contextInterface();
            Context contextC=new Context(new ConcreteStrategyC());
            contextC.contextInterface();
            
        }
    }

    大功告成了么?

    是不是觉得怪怪的?

    此时程序又变成了很早之前的套路,也就是在客户端去判断用什么算法。那么有什么方法将判断转移出去呢?

    下面将其与简单工厂模式进行结合

    改造Context类

    package strategy;
    
    public class ContextUpdate {
        Strategy strategy;
        
        public ContextUpdate(String type) {
            // TODO Auto-generated constructor stub
            switch (type) {
            case "A":
                strategy =new ConcreteStrategyA();
                break;
            case "B":
                strategy =new ConcreteStrategyB();
                break;
            default:
                strategy =new ConcreteStrategyC();
                break;
            }
        }
        
        public void concreteStrategy() {
            strategy.algorithmInterface();
        }
    }

    此时判断便从客户端转移出去了

    初学《设计模式》

  • 相关阅读:
    腾讯TBS加载网页无法自适应记录
    filter过滤器实现验证跳转_返回验证结果
    Oracle不连续的值,如何实现查找上一条、下一条
    springmvc.xml 中 <url-pattern></url-pattern>节点详解
    spring拦截器-过滤器的区别
    (转)spring中的拦截器(HandlerInterceptor+MethodInterceptor)
    @Value("${xxxx}")注解的配置及使用
    mybatis BindingException: Invalid bound statement (not found)
    spring声明式事务管理方式( 基于tx和aop名字空间的xml配置+@Transactional注解)
    Spring事务管理详解_基本原理_事务管理方式
  • 原文地址:https://www.cnblogs.com/zhaoww/p/5090996.html
Copyright © 2020-2023  润新知