策略模式

简介: 策略模式介绍概述所谓策略,指的是一个类的行为或其算法可以在运行时更改.就像出行选择的交通工具,要根据自己的情况,可以自由切换自行车,汽车,火车等等.三个角色环境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'可以用策略模式和状态模式代替

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

目录
相关文章
|
4月前
|
算法 数据安全/隐私保护
行为型 策略模式
行为型 策略模式
27 1
|
设计模式 算法 Java
什么场景要使用策略模式,什么场景不能使用?
如果,让我来设计,我最先想到的就是策略模式。另外,我把往期面试题解析的配套文档我已经准备好,想获得的可以在我的煮叶简介中找到。那么什么场景要使用策略模式,什么场景又不应该使用策略模式呢?我们可以先来看官方对策略模式的定义。
146 0
|
前端开发
策略模式
策略模式
74 0
|
设计模式 算法
策略模式详细介绍
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列的算法,并将每个算法封装到具有共同接口的独立类中,使得它们可以互相替换。策略模式可以让算法的变化独立于使用它的客户端。
107 0
|
算法 测试技术 C#
C#策略模式
C#策略模式
58 0
|
设计模式 前端开发
关于策略模式我所知道的
关于策略模式我所知道的
78 0
|
算法 程序员 开发工具
简单说说我对策略模式的了解
简单说说我对策略模式的了解
78 0
|
设计模式 算法
我学会了,策略模式
策略模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。
110 0
我学会了,策略模式