策略模式

策略模式介绍

概述

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

三个角色

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

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

具体策略ConcreteStrategy 实现的策略类

类图

代码实现

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'可以用策略模式和状态模式代替

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1 场景问题# 1.1 报价管理## 向客户报价,对于销售部门的人来讲,这是一个非常重大、非常复杂的问题,对不同的...
    七寸知架构阅读 10,549评论 9 62
  • 1 场景问题 1.1 报价管理 向客户报价,对于销售部门的人来讲,这是一个非常重大、非常复杂的问题,对不同的客户要...
    4e70992f13e7阅读 8,292评论 2 16
  • 本文仅仅为入门,高手勿喷。 实际工作中,我们总会遇到类似如下的需求:某支付系统接入以下几种商户进行充值:易宝网易,...
    JarvanMo阅读 14,813评论 14 26
  • 1.概述 demo地址,欢迎star 例子1: 商场产品销售:可以正常价格售出,可以打折形式售出,也可以通过积分的...
    barry阅读 4,179评论 0 1
  • 1.问题例1:一个菜单功能能够根据用户的“皮肤”首选项来决定是否采用水平的还是垂直的排列形式。同事可以灵活增加菜单...
    小飞猪阅读 2,958评论 0 0

友情链接更多精彩内容