设计模式-01-策略模式

策略?听起来很有智慧,其实,只是名字唬人而已。策略,通俗的说就是针对某个问题,大家出谋划策,以不同的方式达到解决问题的效果。打个比方,现在是春节,大家吃喝玩乐不亦乐乎,那就说吃饭吧,有时我们细嚼慢咽,而有时就狼吞虎咽,不同的环境下,我们的吃饭方式是不一样的,这就是所谓的策略。

定义:策略模式定义了一组针对某个行为的不同算法实现,并将这些算法封装起来,这些算法都是可以相互替换的,对于客户来说,这些算法的变化都是独立的。

UML图:


从途中可以看出,吃货作为客户,拥有Eatable接口应用,所以可以通过赋值不同的Eatable实现,实现策略模式

例子:

/**
 * 
 * @author 梅东
 * 算法接口
 */
public interface Eatable {
	public void eat();
}


/**
 * 封装算法的实现A
 * 
 * @author 梅东
 */
public class EatableImplA implements Eatable {

	@Override
	public void eat() {
		System.out.println("我狼吞虎咽");
	}

}


/**
 * 封装算法的实现B
 * 
 * @author 梅东
 */
public class EatableImplB implements Eatable {

	@Override
	public void eat() {
		System.out.println("我细嚼慢咽");

	}

}


/**
 * 客户
 * @author 梅东
 *
 */
public class Client {

	private Eatable eatable;

	public void setEatable(Eatable eatable) {
		this.eatable = eatable;
	}

	public void eat() {
		eatable.eat();
	}

	public static void main(String[] args) {
		Client client = new Client();
		client.setEatable(new EatableImplA());
		client.eat();
		System.out.println("改变吃的策略================");
		//改变吃的策略
		client.setEatable(new EatableImplB());
		client.eat();

	}

}

运行结果:

我狼吞虎咽
改变吃的策略================
我细嚼慢咽

至此,我们已经实现了一个简单的策略模式的例子,通过Eatable接口,解耦了客户和具体实现类,记住,解耦是设计模式中很重要的原则之一。

可能有人会问,为什么客户不实现Eatable接口?毕竟客户具有eat行为啊!对,但是如果使用实现接口的做法,我们就无法动态改变eat行为了,这里又引入了一条重要原则,多用组合,少用继承或实现。我们通过组合完美的达到了继承所能达到的效果,还避免了继承所带来的缺陷。

现在你应该可以感叹,策略模式原来如此啊!很简单,策略模式的应用场景我就不多说了,有兴趣的朋友可以查阅资料。

猜你喜欢

转载自zhanyf.iteye.com/blog/1378470
今日推荐