策略:干某件事情的时候可以选择不同种方式进行,每种方式都是独立的,但是各种方式都有某个共同点。如:我们每天上班可以选择不同种去公司的办法,1.公交车,2 地铁,3,班车 4,自己开车,5,自行车,6.步行等等,这里的方式对应着干这件事情不同的办法。
策略模式(Strategy),定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。
注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
组成:
—抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
—具体策略角色:包装了相关的算法和行为。
—环境角色:持有一个策略类的引用,最终给客户端调用。
案例:
/**
* 首先定一个策略接口,各种办法的接口
*/
public interface IStrategy {
/**
* 是一个可执行的算法
*/
public void operate();
}
策略的实现:
public class Aircraft implements IStrategy {
public void operate() {
System.out.println("老王坐飞机去东北");
}
}
public class Bicycle implements IStrategy {
public void operate() {
System.out.println("老王骑自行车去东北");
}
}
public class Car implements IStrategy {
public void operate() {
System.out.println("老王开车去东北");
}
}
容器:调用策略 封装角色,起承上启下的作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。
/**
*
*/
public class Context {
//构造函数,你要使用那个策略
private IStrategy straegy;
public Context(IStrategy strategy) {
this.straegy = strategy;
}
//使用算法
public void operate() {
this.straegy.operate();
}
}
使用:
public class Client {
public static void main(String[] args) {
Context context;
System.out.println("-----------老王准备出发了先准备自驾车去东北-------------");
context = new Context(new Car()); //选择自驾车
context.operate(); //自驾车
System.out.println("\n\n\n\n\n\n\n\n");
System.out.println("-----------老王中途准备换成先准备骑自行车-------------");
context = new Context(new Bicycle());//自行车
context.operate(); //骑着自行车
System.out.println("\n\n\n\n\n\n\n\n");
System.out.println("-----------老王嫌太累准备换成飞机-------------");
context = new Context(new Aircraft());
context.operate(); //坐上飞机
System.out.println("\n\n\n\n\n\n\n\n");
/*
* 策略模式的好处就是:体现了高内聚低耦合的特性
*/
}
}
--end--