策略模式

简介: 策略模式介绍概述所谓策略,指的是一个类的行为或其算法可以在运行时更改.就像出行选择的交通工具,要根据自己的情况,可以自由切换自行车,汽车,火车等等.三个角色环境Context 持有策略strategy的引用,通过引用来调用某ConcreteStrategy定义的算法。

策略模式介绍

概述

所谓策略,指的是一个类的行为或其算法可以在运行时更改.
就像出行选择的交通工具,要根据自己的情况,可以自由切换自行车,汽车,火车等等.

三个角色

环境Context 持有策略strategy的引用,通过引用来调用某ConcreteStrategy定义的算法。

抽象策略Strategy 定义所有支持的算法的公共接口

具体策略ConcreteStrategy 实现的策略类

类图

img_b75d2e163f31a29e377a48f2412c03ad.jpe

代码实现

1.抽象策略接口

public interface Strategy {
    
    public void travel();

}

具体策略的实现

public class BikeStrategy implements Strategy{

    @Override
    public void travel() {
        // TODO Auto-generated method stub
        System.out.println("we can travel by bike");

    }

}
public class BusStrategy implements Strategy{

    @Override
    public void travel() {
        // TODO Auto-generated method stub
        System.out.println("we can travel by Bus");

    }

}

public class CarStrategy implements Strategy{

    @Override
    public void travel() {
        // TODO Auto-generated method stub
        System.out.println("we can travel by Car");
    }

}

3.策略持有者和执行者

public class Context {
       private Strategy strategy;

       public Context(Strategy strategy){
          this.strategy = strategy;
       }

    public void executeStrategy(){
           strategy.travel();
       }

}

4.测试


public class Test {
    
    /**
     * 构建的过程放在客户端,客户端根据自己的需求 ,自己选择不同的策略
     * @param args
     */
    public static void main(String[] args) {
        System.out.println("===========我选择策略一==========");
        Strategy strategy=new CarStrategy();
        Context context =new Context(strategy);
        context.executeStrategy();
        System.out.println("===========我选择策略二==========");
        Strategy strategy1=new BikeStrategy();
        Context context1 =new Context(strategy1);
        context1.executeStrategy();
        System.out.println("===========我选择策略三==========");
        Strategy strategy3=new BusStrategy();
        Context context3 =new Context(strategy3);
        context3.executeStrategy();

    }

}

5.测试结果

===========我选择策略一==========
we can travel by Car
===========我选择策略二==========
we can travel by bike
===========我选择策略三==========
we can travel by Bus

总结

写法类似于状态模式,但思想却不像状态模式.

策略模式注重于,采用何种策略,去解决问题.策略构建的过程放在客户端,客户端根据自己的需求 ,自己选择不同的策略

状态模式则注重于,切换状态,以及优雅的切换状态中的动作.状态构建的过程放在Context中,客户端只需要执行不同的动作即可.

但是话又说回来,'if else'可以用策略模式和状态模式代替

其实这都使用了面向对象的多态的特性==>子类的对象可以指向父类的引用,允许不同类的对象对同一消息作出响应.

目录
相关文章
|
2月前
|
设计模式 算法 搜索推荐
策略模式的小记
本文介绍了策略模式的概念、结构和使用场景,并通过支付系统的例子展示了如何使用策略模式来动态选择不同的支付策略,包括定义支付策略接口、实现具体的支付策略类、创建上下文类以及在客户端动态选择支付策略。
策略模式的小记
|
6月前
|
算法 数据安全/隐私保护
行为型 策略模式
行为型 策略模式
35 1
|
设计模式 算法 Java
什么场景要使用策略模式,什么场景不能使用?
如果,让我来设计,我最先想到的就是策略模式。另外,我把往期面试题解析的配套文档我已经准备好,想获得的可以在我的煮叶简介中找到。那么什么场景要使用策略模式,什么场景又不应该使用策略模式呢?我们可以先来看官方对策略模式的定义。
164 0
|
前端开发
策略模式
策略模式
79 0
|
设计模式 算法
策略模式详细介绍
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列的算法,并将每个算法封装到具有共同接口的独立类中,使得它们可以互相替换。策略模式可以让算法的变化独立于使用它的客户端。
123 0
|
算法 测试技术 C#
C#策略模式
C#策略模式
70 0
|
设计模式 前端开发
关于策略模式我所知道的
关于策略模式我所知道的
87 0
|
算法 程序员 开发工具
简单说说我对策略模式的了解
简单说说我对策略模式的了解
87 0