模式定义:
定义了算法族,分别封装起来,让他们之前可以互相转换,此模式然该算法的变化独立于使用算法的客户。
模式结构:
模式实现:
public class Strategy {
/**
* 抽象交通工具类
*/
abstract class Vehicle {
/**
* 名称
*/
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 抽象方法
*/
abstract void go();
}
/**
* 汽车工具
*/
class Car extends Vehicle {
@Override
void go() {
System.out.println("use car");
}
}
/**
* 腿工具
*/
class Leg extends Vehicle {
@Override
void go() {
System.out.println("use leg");
}
}
/**
* 飞机工具
*/
class Plane extends Vehicle {
@Override
void go() {
System.out.println("use Plane");
}
}
/**
* 旅行类
*/
class Travel {
/**
* 交通工具
*/
private Vehicle vehicle;
public Vehicle getVehicle() {
return vehicle;
}
public void setVehicle(Vehicle vehicle) {
this.vehicle = vehicle;
}
public void travel() {
vehicle.go();
}
}
/**
* 测试类
*/
@Test
public void strategyTest() {
//使用汽车旅行
Vehicle vehicle = new Car();
vehicle.setName("bmw");
//如需更改,只需添加两行代码即可
vehicle = new Leg();
vehicle.setName("strong leg");
//新建旅行类,并设置交通工具,调用方法
Travel travel = new Travel();
travel.setVehicle(vehicle);
travel.travel();
}
}
模式优点:
1、策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。
2、策略模式提供了可以替换继承关系的办法。
3、使用策略模式可以避免使用多重条件转移语句。
模式缺点:
1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
2、策略模式将造成产生很多策略类,
适用场景:
1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为
2、一个系统需要动态地在几种算法中选择一种
3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现
ps:本人使用的测试代码为JUnit单元测试代码
ps的ps:个人感觉,设计模式了解即可,重点是要形成面向对象编程的习惯。
ps的ps的ps:贴一个链接,可查看目前大部分的设计模式,真的不是我懒呦~