设计模式--[11]策略模式

概述

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

三个角色

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值