在理解代码前先理解下面角色代表:
抽象策略角色:策略类,通常由一个接口或者抽象类实现:
具体策略角色:包装了具体需要执行的算法和行为:AddStrategy抽象接口的实现类
环境角色:持有一个抽象策略类的引用(比如这里就是使用了多态)
客户端这个时候就需要知道有哪些具体的策略,传一个策略角色实例,那么就会按照具体的策略角色去实现:
抽象策略角色
/*
* 这个就相当于策略模式
* 抽象策略模式角色:策略类,通常由一个接口或者抽象类实现:Strategy
* 具体策略角色:包装了相关的算法和行为:类AddStrategy等,接口的实现类
* 环境角色:持有一个策略类的引用,最终给客户端调用:TreeSet类
*/
public interface Strategy
{
public int calculate(int a,int b);//抽象的类中的
}
具体策略角色
public class SubtractStrategy implements Strategy
{
@Override
public int calculate(int a, int b)
{
return a - b;
}
}
public class DevideStrategy implements Strategy
{
@Override
public int calculate(int a, int b)
{
return a / b;
}
}
public class AddStrategy implements Strategy
{
@Override
public int calculate(int a, int b)
{
return a + b;
}
}
public class MultiplyStrategy implements Strategy
{
@Override
public int calculate(int a, int b)
{
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()
{
return strategy;
}
public int calcullate(int a, int b)
{
return strategy.calculate(a,b);
//传进来的值就按照你给的策略进行计算,因为此时的strategy变成你传进来的那个策略j.bnm
//strategy本来就是哪个接口的一个引用所以在这里面调用的是哪个接口的calculate()方法
//又因为这个是一个接口,只有抽象的方法,所以真正实现的方法在实现类中
}
}
客户端
public class Client
{
/*
* 主要讲的是策略模式
*/
public static void main(String[] args)
{
AddStrategy addStrategy = new AddStrategy();
Environment environment = new Environment(addStrategy);
System.out.println(environment.calcullate(3,4));
SubtractStrategy subtractStrategy =new SubtractStrategy();
Environment enviroment1 = new Environment(subtractStrategy);
System.out.println(enviroment1.calcullate(5,7));
MultiplyStrategy multiplyStrategy = new MultiplyStrategy();
Environment environment3 = new Environment(multiplyStrategy);
System.out.println(environment3.calcullate(2,4));
DevideStrategy devideStrategy = new DevideStrategy();
Environment environment4 = new Environment(devideStrategy);
System.out.println(environment4.calcullate(6,2));
}
}