一.策略模式是对象的行为模式,用意是对一组算法的封装。动态的选择需要的算法并使用
一个接口,两个实现类1,2,一个client调用类,用于块定是调用类1还是类2.
UML示意图

二.组成部分:
1. 环境角色:持有一个策略类引用
2. 抽象策略
3. 具体策略:相关的算法或操作
三.代码例子
1. 抽象策略
package com.eekq.strategy;
public interface IStrategy
{
/**策略方法*/
public abstract double add();
}
2. 具体策略,这里我以两个具体策略为例
package com.eekq.strategy;
public class ConcreteStrategy1 implements IStrategy
{
/**示意性算法*/
public double add()
{
// TODO 自动生成方法存根
System.out.println(this.getClass().getName()
+ "的加法运算");
return 0;
}
}
package com.eekq.strategy;
public class ConcreteStrategy2 implements IStrategy
{
public double add()
{
// TODO 自动生成方法存根
System.out.println(this.getClass().getName()
+ "的加法运算");
return 0;
}
}
3.环境角色
package com.eekq.strategy;
public class Context
{
/**环境角色类*/
private IStrategy strategy;
public Context(IStrategy
strategy) {
this.strategy =
strategy;
}
/**策略方法*/
public double add()
{
this.strategy.add();
return 0;
}
}
4.客户端调用
package com.eekq.strategy;
public class Main
{
/**
*@paramargs
*/
public static void main(String[]
args) {
// TODO 自动生成方法存根
Context context = new Context(new ConcreteStrategy1());
context.add();//执行算法1
context = new Context(new ConcreteStrategy2());
context.add();//执行算法2
}
}
5.执行结果:
com.eekq.strategy.ConcreteStrategy1的加法运算
com.eekq.strategy.ConcreteStrategy2的加法运算
6.总结
优点:动态改变算法或行为
缺点:客户端必须知道所有的策略类,并自行决定使用哪一个策略类,必须对每一个算法了解
【策略模式UML图】
【策略模式-JAVA代码实现】
从策略模式UML图中可以看到Context与接口Strategy是组合关系,即强引用关系。
新建一个轮胎接口:
package strategy_interface; public interface tyre_interface { // tyre 轮胎 public void print_tyre_line();// 显示出轮胎的痕迹 } |
新建2个轮胎接口的实现类:
package strategy_implement; import strategy_interface.tyre_interface; //长痕迹轮胎类 public class tyre_long_implement implements tyre_interface { public void print_tyre_line() { System.out.println("在路面上显示一个长轮胎痕迹"); } } |
package strategy_implement; import strategy_interface.tyre_interface; //短痕迹轮胎类 public class tyre_short_implement implements tyre_interface { public void print_tyre_line() { System.out.println("在路面上显示一个短轮胎痕迹"); } |
基于一个轮胎接口来实现不同样式的轮胎样式。
组装一个Car车类:
package car_package; import strategy_interface.tyre_interface; public class Car { private String make_address;// 制造地 private int death_year;// 报废年限 private int speed;// 速度 private tyre_interface tyre_interface_ref;// 轮胎的样式 public String getMake_address() { return make_address; } public void setMake_address(String make_address) { this.make_address = make_address; } public int getDeath_year() { return death_year; } public void setDeath_year(int death_year) { this.death_year = death_year; } public int getSpeed() { return speed; } public void setSpeed(int speed) { this.speed = speed; } public tyre_interface getTyre_interface_ref() { return tyre_interface_ref; } public void setTyre_interface_ref(tyre_interface tyre_interface_ref) { this.tyre_interface_ref = tyre_interface_ref; } public void start() { System.out.println("车的基本信息为:"); System.out.println("制造地make_address:" + this.getMake_address()); System.out.println("报废年限death_year:" + this.getDeath_year()); System.out.println("速度speed:" + this.getSpeed()); System.out.println("Car 起动了!"); System.out.println("Car高速行驶,遇到一个大转弯,路面显示:"); this.getTyre_interface_ref().print_tyre_line(); } } |
让车跑起来,并且具有更换轮胎样式的功能:
package main_run; import strategy_implement.tyre_long_implement; import strategy_implement.tyre_short_implement; import car_package.Car; public class run_main { public static void main(String[] args) { tyre_long_implement tyre_long_implement = new tyre_long_implement(); tyre_short_implement tyre_short_implement = new tyre_short_implement(); Car car = new Car(); car.setDeath_year(8); car.setMake_address("北京朝阳区"); car.setSpeed(200); car.setTyre_interface_ref(tyre_long_implement); car.start(); } } |
控制台打印出:
车的基本信息为: 制造地make_address:北京朝阳区 报废年限death_year:8 速度speed:200 Car 起动了! Car高速行驶,遇到一个大转弯,路面显示: 在路面上显示一个长轮胎痕迹 |
是一个长轮胎痕迹,但在程序中可以使用代码:car.setTyre_interface_ref(tyre_long_implement);来对轮胎的样式进行不同的替换,可以替换成短轮胎痕迹的汽车轮胎,这样在不更改Car类的前题下进行了不同轮胎样式的改变,轮胎和轮胎之间可以互相替换,这就是策略模式。