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

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

    初学《设计模式》

  • 相关阅读:
    关于dependency的scope
    Enum
    vim
    postgres函数
    Static块与线程安全
    查看文件夹及文件大小df du
    mac下安装jdk
    硬盘修复原理
    关于Jquery的Accordion在IE下闪烁,不稳定的问题
    vmare安装linux问题总结4(redhat在启动时卡在sendmail很久)
  • 原文地址:https://www.cnblogs.com/zhaoww/p/5090996.html
Copyright © 2011-2022 走看看