1.什么是策略模式:
定义一组算法,将每个算法都封装起来,并且他们之间可以互换。
策略模式使这些算法在客户端调用他们的时候能够互不影响地变化
策略模式体现两个非常基本的面向对象设计的原则:
1.封装变化的概念
2.编程中使用接口,而不是对接口的实现
**************************************************************************************
策略模式的组成
抽象策略角色:策略类,通常是一个接口或者抽象类实现
具体策略角色:包装了相关的算法和行为
环境角色:持有一个策略类的引用,最终给客户端调用
策略模式的实现步骤
1.对策略对象定义一个公共接口。
2.编写策略类,该类实现公共接口。
3.在使用策略对象的类中保存一个对策略对象的引用。
4.在使用策略对象的类中,实现对策略对象的set和get方法或使用构造方法完成赋值。
缺点:
1.客户端必须知道所有的策略类,并决定使用哪个策略类
2.造成很多策略类
解决方法:使用工厂方法
****************************************************************************************
抽象角色:
public interface Strategy
{
public int calculate(int a, int b);
}
两个具体抽象角色:
//定义加法功能
public class AddStrategy implements Strategy
{
public int calculate(int a, int b)
{
return a + b;
}
}
//定义除法角色
public class DivStrategy implements Strategy
{
@Override
public int calculate(int a, int b)
{
// TODO Auto-generated method stub
return a / b;
}
}
环境角色:
public class Environment
{
private Strategy strategy;
public Environment(Strategy strategy)
{
this.strategy = strategy;
}
public void setStrategy(Strategy strategy)
{
this.strategy = strategy;
}
public Strategy getStrategy(Strategy strategy)
{
return this.strategy;
}
public int calculate(int a, int b)
{
return strategy.calculate(a, b);
}
}
测试类:
public class Client
{
public static void main(String[] args)
{
//设置加法策略
AddStrategy addStrategy = new AddStrategy();
//通过加法构造环境角色
Environment environment = new Environment(addStrategy);
//
System.out.println(environment.calculate(3, 4));
DivStrategy divStrategy = new DivStrategy();
Environment environment2 = new Environment(divStrategy);
System.out.println(environment2.calculate(3, 1));
//environment通过调用setStrategy,改变策略
environment.setStrategy(divStrategy);
System.out.println(environment.calculate(2, 2));
}
}
这里单纯看System.out.println(environment.calculate(2,3))无法判断执行什么策略,完全依靠传入的策略模式。