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

    策略模式 

    分类:

    行为型模式

    定义:

    只有算法或行为不同,可以将其包装成策略类

    实现主类可以轻易替换策略类,它的行为可以随着策略的更换而改变

    实现:

    1.策略接口(目的是实现主类策略方法的多态)

    2.策略接口的实现类(具体的策略实现方法的载体)

    3.主类(使用策略)

    绍:

     

    意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

    主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。(违反单一职责原则,开闭原则)

    何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。

    如何解决:将这些算法封装成一个一个的类,任意地替换。

    关键代码:实现同一个接口。

    应用实例: 

    1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。

    2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。

    3JAVA AWT 中的 LayoutManager

    优点: 

    1、算法可以自由切换。

    2、避免使用多重条件判断。

    3、扩展性良好。

    缺点: 

    1、策略类会增多。

    2、所有策略类都需要对外暴露。

    使用场景: 

    1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

    2、一个系统需要动态地在几种算法中选择一种。

    3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

    注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

     

    实现代码:

    1)策略接口--Strategy.java

    public interface Strategy {

       public int doOperation(int num1, int num2);

    }

    2)实现接口的实体类--OperationAdd.java    OperationSubtract.java    OperationMultiply.java

    public class OperationAdd implements Strategy{

       @Override

       public int doOperation(int num1, int num2) {

          return num1 + num2;

       }

    }

     

    public class OperationSubtract implements Strategy{

       @Override

       public int doOperation(int num1, int num2) {

          return num1 - num2;

       }

    }

     

    public class OperationMultiply implements Strategy{

       @Override

       public int doOperation(int num1, int num2) {

          return num1 * num2;

       }

    }

    3)一个行为随着策略对象改变而改变的 context 对象

    public class Context {

       private Strategy strategy;

     

       public Context(Strategy strategy){

          this.strategy = strategy;

       }

     

       public int executeStrategy(int num1, int num2){

          return strategy.doOperation(num1, num2);

       }

    }

    4)使用--StrategyPatternDemo

    public class StrategyPatternDemo {

       public static void main(String[] args) {

          Context context = new Context(new OperationAdd());   

          System.out.println("10 + 5 = " + context.executeStrategy(10, 5));

     

          context = new Context(new OperationSubtract());     

          System.out.println("10 - 5 = " + context.executeStrategy(10, 5));

     

          context = new Context(new OperationMultiply());   

          System.out.println("10 * 5 = " + context.executeStrategy(10, 5));

       }

    }

  • 相关阅读:
    Pycharm(Mac版)快捷键操作篇
    Ubuntu报E: 仓库 “http://ppa.launchpad.net/webupd8team/sublime-text-3/ubuntu bionic Release” 没有 Release 文件。
    Ubuntu安装出现无法锁定管理目录是否有其他进程正在占用它?
    解决Ubuntu(18.04LTS)和win10电脑之间无法复制粘贴问题
    数据库的基本查询
    Ubuntu下数据库的操作
    Ubuntu中vi上下左右键退格键失灵的问题
    Ubuntu 18.04TLS命令安装Pycharm并固定在快速启动栏
    Ubuntu下mysql连接Navicat premium报错
    Ubuntu安装mysql报ERROR 1698 (28000): Access denied for user 'root'@'localhost',有效的解决办法
  • 原文地址:https://www.cnblogs.com/aczy/p/14322151.html
Copyright © 2011-2022 走看看