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

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

    初学《设计模式》

  • 相关阅读:
    Linux 下的类似Windows下Everything的搜索工具
    windows和linux环境下制作U盘启动盘
    程序调试手段之gdb, vxworks shell
    LeetCode 1021. Remove Outermost Parentheses (删除最外层的括号)
    LeetCode 1047. Remove All Adjacent Duplicates In String (删除字符串中的所有相邻重复项)
    LeetCode 844. Backspace String Compare (比较含退格的字符串)
    LeetCode 860. Lemonade Change (柠檬水找零)
    LeetCode 1221. Split a String in Balanced Strings (分割平衡字符串)
    LeetCode 1046. Last Stone Weight (最后一块石头的重量 )
    LeetCode 746. Min Cost Climbing Stairs (使用最小花费爬楼梯)
  • 原文地址:https://www.cnblogs.com/zhaoww/p/5090996.html
Copyright © 2011-2022 走看看