zoukankan      html  css  js  c++  java
  • 策略模式【java版】

    一、基本结构

        组成:

             a)策略接口:1个
             b)具体策略类:多个,封装了具体的算法和行为
             c)调度类:  1个,持有某具体策略类的引用,供客户端使用

       策略接口:

    //策略接口,定义了不同策略供外部调用的“通用方法”
    public interface StrategyInterface {

    public void multiWay_tour();
    }

       具体策略类一:

    public class FirstConcreteStrategy implements StrategyInterface {

    public void multiWay_tour() {//策略方法的具体实现

    System.out.println("I'll go tourism on feet!");
    }

    }

       具体策略类二:

    public class SecondConcreteStrategy implements StrategyInterface {

    public void multiWay_tour() {//策略方法的具体实现

    System.out.println("I'll go tourism by train!");
    }

    }

       调度类:

    public class Context {

    private StrategyInterface strategyInterface;

    //调度类,根据传进来的具体策略对象的引用,调用其对应的方法
    public Context(StrategyInterface strategyInterface) {

    this.strategyInterface=strategyInterface;
    }

    public void multiWay_tour(){

    this.strategyInterface.multiWay_tour();
    }

    }

       说明: 如何体现“对扩展开放,对修改封闭”?

             当有新的具体策略需要添加时,只需要定义一个新的“具体策略类”,整个结构中,无需做任何修改


    二、测试

       测试代码:

    public class Main {

    public static void main(String[] args) {
    System.out.println("开始测试策略模式。。。");

    //定义多个调度类对象
    Context firstContext=new Context(new FirstConcreteStrategy());
    Context secondContext=new Context(new SecondConcreteStrategy());

    //调用“通用方法”,只通过“调度类”实现,算法之间的差异已被屏蔽
    firstContext.multiWay_tour();
    secondContext.multiWay_tour();
    }

    }

       运行结果:

    三、策略模式与简单工厂模式对比:

       简单工厂模式:根据不同的情况,创建不同的对象,对象之间类型差别较大,

             有可能各个类的方法名和个数差别很大

                             注重不同对象的创建:根据不同的情况创建不同的对象(eg:下单,查资金等)

       策略模式根据不同的情况,创建不同的对象.对象不同类型相近,方法差别大. 尤其适合经

             常变动的多种不同算法。 一般用于多个类的方法名都相同,但是实现方式不同

                             注重多个对象的相同行为屏蔽方法名相同,算法实现细节不同之间的差异

                                      (eg:txt、xml、dat、access四种格式的数据操作,读取,删除,修改) 

        

  • 相关阅读:
    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
    11
    实战 迁移学习 VGG19、ResNet50、InceptionV3 实践 猫狗大战 问题
    tx2系统备份与恢复
    如何在Ubuntu 18.04上安装和卸载TeamViewer
    bzoj 3732 Network (kruskal重构树)
    bzoj2152 聪聪可可 (树形dp)
    牛客 216D 消消乐 (二分图最小点覆盖)
    牛客 197E 01串
    Wannafly挑战赛23
  • 原文地址:https://www.cnblogs.com/edisonfeng/p/2301074.html
Copyright © 2011-2022 走看看