设计模式(15)-----策略设计模式

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

主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。

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

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

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

应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 3、JAVA AWT 中的 LayoutManager。

优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

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

创建一个接口。

public interface Strategy {
   public int doOperation(int num1, int num2);
}

步骤 2

创建实现接口的实体类。

OperationAdd.java

public class OperationAdd implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 + num2;
   }
}

OperationSubstract.java

1 public class OperationSubstract implements Strategy{
2    @Override
3    public int doOperation(int num1, int num2) {
4       return num1 - num2;
5    }
6 }

OperationMultiply

1 public class OperationMultiply implements Strategy{
2    @Override
3    public int doOperation(int num1, int num2) {
4       return num1 * num2;
5    }
6 }

步骤 3

创建 Context 类。

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

使用 Context 来查看当它改变策略 Strategy 时的行为变化。

StrategyPatternDemo

 1 public class StrategyPatternDemo {
 2    public static void main(String[] args) {
 3       Context context = new Context(new OperationAdd());
 4       System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
 5
 6       context = new Context(new OperationSubstract());
 7       System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
 8
 9       context = new Context(new OperationMultiply());
10       System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
11    }
12 }

步骤 5

执行程序,输出结果:

10 + 5 = 15
10 - 5 = 5
10 * 5 = 50

策略模式其实就是动态的知道最后调用谁。当客户端输入调用者的时候去决定最后实现谁的实现类。

ff

原文地址:https://www.cnblogs.com/qingruihappy/p/9788882.html

时间: 2024-10-12 03:34:49

设计模式(15)-----策略设计模式的相关文章

设计模式之策略设计模式

一.何为策略设计模式呢? 在我的理解中,策略模式是尽量使用组合而非继承来实现一个行为,对一个方法的进行封装来使用,在组合类中进行调用时能够随时改变这一方法的运行时的内容.下面让我们来看看将一个实现改成策略模式后的便捷性. 二.一个简单的示例 假设我们有一个抽象的人,他拥有会踢球跟会乐器的技能,然后有一个只会踢球不会乐器的人继承了这个抽象的人类,还有一个只会乐器不会踢球的人继承了这个抽象的人类. 1 abstract class People{ 2 abstract void playBall()

设计模式之------策略设计模式

<?php /** **策略模式:定义一系列算法,使他们可相互替换,并且算法的改变不影响使用他们的客户 *******/ interface strategy{ public function filter(); } class User implements strategy{ public function filter(){ echo 'user filter'; } }   class Enery implements strategy{ public function filter()

23种设计模式之策略设计模式

策略模式:分别封装行为接口,实现算法组,超类里放行为接口对象,在子类里具体设定行为对象.原则就是:分离变化部分,封装接口,基于接口编程各种功能.此模式让行为算法的变化独立于算法的使用者. 策略模式注意点:1)分析项目中变化部分与不变部分:2)多用组合少用继承:用行为类组合,而不是行为的继承更有弹性. 鸭子游戏项目设计思路 一般设计是分析鸭子类别,把相同的放在抽象超类中实现,不同的在抽象超类中定义为抽象方法,然后不同的鸭子继承抽象超类,实现抽象方法 public abstract class Du

【设计模式】策略设计模式

假设今天老婆让我去丈母娘家做客,可是我答应了我的情人晚上要回去陪她,这可怎么办?,,正在我纠结的时候,好哥们给我一个三个理由包,让我不要看,到时候看情况拆开 接口 三个妙计是同一个类型,继承同一个接口 /** * 声明一个接口 * @author TTF * */ public interface JieKou { public void reson(); } 三个理由类 喝酒时候的理由 public class HeJiu implements JieKou { @Override publi

设计模式之策略模式(Strategy)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

接口的常用用法都有什么?策略设计模式复习总结

从之前的一个总结性话题引出: 从接口.抽象类到工厂模式再到JVM来总结一些问题 涉及的知识点总结如下: 策略模式概念和例子 工厂模式和策略模式比较 策略模式优缺点 策略模式的意义 使用了策略模式的API——HttpServlet类分析 解决策略膨胀问题——享元模式 StrategyPattern:策略模式也算比较简单的,同工厂模式一样都属于面向接口编程……策略模式是对象的行为模式之一,而工厂模式是对象的创建模式!它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口

大话设计模式_策略模式(Java代码)

策略模式:定义算法家族,分别封装,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户 简单描述:一个父类,多个子类实现具体方法.一个Context类持有父类的引用(使用子类实例化此引用),客户端代码只需要与此Context类交互即可 大话设计模式中的截图: 例子代码: 策略类: 1 package com.longsheng.strategy; 2 3 public abstract class Strategy { 4 5 public abstract double getR

设计模式之策略模式20170720

行为型设计模式之策略模式: 一.含义 策略模式是一种比较简单的模式,也叫做政策模式,其定义如下: 定义一组算法(可抽象出接口),将每个算法都封装起来,并且使它们之间可以互换(定义一个类实现封装与算法切换) 二.代码说明 1.主要有两个角色 1)Context封装角色 它也叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略,算法的直接访问,封装可能存在的变化. 2)策略角色 该类含有具体的算法 2.在用C实现过程中也是参考这种思想,以压缩,解压算法举例,具体实现如下: 1)策略模式使用场景

【设计模式】1.策略设计模式

策略设计模式的定义: 策略设计模式是把每一个算法封装到具有共同接口的独立类中,具体算法之间可以相互替换或者变化,这种变化不会影响客户端. 关键词:[算法封装] [共同接口] [自由替换] 策略设计模式的代码: 1 public interface IStrategy { //共同接口 2 public void doSomething(); 3 } 4 class ConcreteStrategyA implements IStrategy { //具体策略A(算法) 5 public void