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

    设计模式之策略模式

    什么是策略模式?

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

    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();
        }
    }

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

    初学《设计模式》

  • 相关阅读:
    初始MyBatis
    h5调用相机相册
    canvas详解
    js闭包
    Vue和React对比篇
    js造成内存泄漏的几种情况
    js合并对象
    git常用命令小结
    如何隐藏overflow: scroll的滚动条
    js数组sort排序方法的算法
  • 原文地址:https://www.cnblogs.com/zhaoww/p/5090996.html
Copyright © 2011-2022 走看看