试想这样的场景,一个员工,在面向对象设计里,它自己维护了自己的工作时长,职位类型等成员变量,那么我们做公司管理系统时就可能希望将计算工资这个方法放在员工类里,当我们想要知道一个员工的工资,就调用这个员工的getSalary()方法。但是问题是一个员工的工资计算策略可能会变,今天他是固定工资,明天经理觉得他表现不错,就想把他改成别的工资策略了说不定。因此该场景下,Context就是一个Worker,Worker持有一个Strategy的引用。具体策略继承Strategy抽象类或者实现Strategy接口。
官方类图:
代码如下:
Strategy接口:
public interface Strategy {
int calculateSalary();
}
A_Strategy类:
public class A_Strategy implements Strategy{
@Override
public int calculateSalary() {
return 4000;
}
}
B_Strategy类:
public class B_Strategy implements Strategy{
private int hours;
public B_Strategy(){
hours=10;
}
@Override
public int calculateSalary() {
return 50*hours;
}
}
Worker类:
public class Worker{
Strategy strategy;
public Worker(Strategy strategy){
this.strategy=strategy;
}
public int getSalary(){
return strategy.calculateSalary();
}
}
main方法:
public class Main {
public static void main(String[] args){
Worker worker=new Worker(new A_Strategy());
System.out.println(worker.getSalary());
worker.setStrategy(new B_Strategy());
System.out.println(worker.getSalary());
}
}