策略模式
其实就是对做一件事,有不同的实现方式。这种实现方式就是一种策略,相同的事情不同的策略。
举例或场景
- 对数组进行排序:那么排序就是事,而对于排序的实现可以有很多种,可以按照对象不同的属性进行排序,也可以按照不同的算法进行排序,这些都是策略。
- 对对象进行序列化:那序列化就是事,而序列化的不同实现就是不同的策略。比如序列化成json格式。或者xml格式。或者二进制格式等。
- 接口协议:接口就是事,而协议或者数据格式就是策略。比如相同的接口,那么接收不同协议或者数据格式的内容就是不同的策略。比如相同的数据提交查询,条件的接收可以是表达form的,也可以rest 的也可以soap等不同的策略。
我觉得通过举例也已经说明了策略模式的概念了。
实现
在java实现中,策略模式的都是通过一个接口和不同的实现类来完成的。
这里举例一个对于对象的不同格式化策略,大致实现代码:
//一个简单的javaBean对象,没什么好解释的
public class JBean {
public JBean(String name, int age) {
super();
this.name = name;
this.age = age;
}
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
//策略的接口 ,泛型的,那么可以对任意对象进行format操作了
public interface Format<T> {
String format(T t);
}
//第一种策略 ,用字符串显示JBean对象的属性
public class StrFormat implements Format<JBean> {
@Override
public String format(JBean t) {
return "JBean [name=" + t.getName() + ", age=" + t.getAge() + "]";
}
}
//第二种策略,用xml来显示JBean对象的属性
public class XMLFormat implements Format<JBean> {
@Override
public String format(JBean t) {
return "<JBXML><name>"+t.getName()+"</name><age>"+t.getAge()+"</age></JBXML>";
}
}
//具体的使用,用不同的策略打印了JBean的格式化
public class Strategy {
public static void main(String[] args) {
JBean j1 = new JBean("tom", 8);
Format<JBean> f1 = new XMLFormat();
System.out.println(f1.format(j1));
Format<JBean> f2 = new StrFormat();
System.out.println(f2.format(j1));
}
}
// 也许这样并不能体现策略的优势,
//稍微带点需求,根据不同的条件来显示不同的输出格式,
//这样是不是就靠点边了。
//根据不同的参数启用不同的策略。
public class Strategy {
public static void main(String[] args) {
JBean j = new JBean("tom", 8);
Format<JBean> f ;
if(args[0]==1)
{
f=new XMLFormat();
}else if (args[0]==0){
f=new StrFormat();
}
System.out.println(f.format(j));
}
}
这些代码并不严谨,只是为了表一下意思而已。