我的java设计模式 总结【2】策略 Strategy

策略模式

其实就是对做一件事,有不同的实现方式。这种实现方式就是一种策略,相同的事情不同的策略。

举例或场景

  • 对数组进行排序:那么排序就是事,而对于排序的实现可以有很多种,可以按照对象不同的属性进行排序,也可以按照不同的算法进行排序,这些都是策略。
  • 对对象进行序列化:那序列化就是事,而序列化的不同实现就是不同的策略。比如序列化成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));
	}
}

这些代码并不严谨,只是为了表一下意思而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值