java设计模式--------策略模式

策略模式,就像是主公手下的众多谋士,每个人有每个人的想法,那主公采纳谁的得呢,主公想呀: “我且看战局的变化,随着战局的变化谁的谋略适合战局,就用谁的”。(个人理解)

主要解决: 在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护

优点:

  1. 算法可以自由切换。
  2. 避免使用多重条件判断。
  3. 扩展性良好。

缺点:

  1. 策略类会增多。
  2. 所有策略类都需要对外暴露。

使用场景:

  1. 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
  2. 一个系统需要动态地在几种算法中选择一种。
  3. 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

注意事项: 如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

在代码的世界里,我们就是主公,我们用到那个策略,那就new一个,对吧。那到底代码怎么写呢?

第一步:攻城略地不止有策略,还有军士,器械,粮草等;既然策略是一方面,我们就得来一个策略接口,每个谋士都得实现这个接口的实现类;

public  interface  Strategy{
	public  String  proposeStrategy();
}

第二步:谋士实现接口,提出具体的策略

public class AdviserA implements Strategy{
 	@Override
	public  String  proposeStrategy(){
		return “草船借箭”;
	}
}
public class AdviserB implements Strategy{
 	@Override
	public  String  proposeStrategy(){
		return “火烧连营”;
	}
}
public class AdviserC implements Strategy{
 	@Override
	public  String  proposeStrategy(){
		return “空城计”;
	}
}

第三步:根据战局的变化修改需要的策略

public  class  Context{
	//注入
	private  Strategy strategy;
	public Context(Strategy strategy){
		 this.strategy =strategy
	}
	public String executeStrategy(){
		return strategy.proposeStrategy();
  	 }
}

第四步 :测试

public class StrategyPatternTest {
	public static void main(String[] args) {
	       Context context = new Context(new AdviserA());
	       System.out.println("AdviserA的策略: "+context.executeStrategy());
	       context =new Context(new AdviserB());
	       System.out.println("AdviserB的策略: "+context.executeStrategy());
	       context =new Context(new AdviserC());
	       System.out.println("AdviserC的策略: "+context.executeStrategy());
	   }
}

结果 :

AdviserA的策略: 草船借箭
AdviserB的策略: 火烧连营
AdviserC的策略: 空城计

你可能感兴趣的:(java设计模式--------策略模式)