策略模式
1.策略模式中体现了两个非常基本的面向对象设计的原则
—封装变化的概念
—编程中使用接口,而不是对接口的实现
这是一种面向接口的编程
2.策略模式的意义是极大提高了软件的可重用性。
策略模式可以把行为和环境分割开来
3.策略模式的组成:
—抽象策略角色:策略类,通常由一个接口或者抽象类实现。
—具体策略角色:包装了相关的算法和行为
—环境角色:持有一个策略类的引用,最终给客户端调用的。
4.策略模式的编写步骤
—1.对策略对象定义一个公共接口。
package com.test.strategy;
public interface Strategy {
public int calculate(int a,int b);
}
—2.编写策略类,该类实现了上面的公共接口
package com.test.strategy;
public class Addstrategy implements Strategy {
@Override
public int calculate(int a, int b) {
// TODO Auto-generated method stub
return a+b;
}
}
package com.test.strategy;
public class SubtractStrategy implements Strategy{
@Override
public int calculate(int a, int b) {
// TODO Auto-generated method stub
return a-b;
}
}
package com.test.strategy;
public class MultiplyStrategy implements Strategy {
@Override
public int calculate(int a, int b) {
// TODO Auto-generated method stub
return a*b;
}
}
package com.test.strategy;
public class DivideStrategy implements Strategy {
@Override
public int calculate(int a, int b) {
// TODO Auto-generated method stub
return a/b;
}
}
—3.在使用策略对象的类中保存一个对策略对象的引用
package com.test.strategy;
public class Environment {
private Strategy strategy;
public Environment(Strategy strategy)
{
this.strategy = strategy;
}
public Strategy getStrategy() {
return strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public int calculate(int a,int b)
{
return strategy.calculate(a, b);
}
}
—4.在环境类中,实现对策略对象的set和get方法,或者使用构造方法
最后是使用:
package com.test.strategy;
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));
SubtractStrategy subtractStrategy = new SubtractStrategy();
environment.setStrategy(subtractStrategy);
System.out.println(environment.calculate(4, 5));
MultiplyStrategy multiplyStrategy = new MultiplyStrategy();
environment.setStrategy(multiplyStrategy);
System.out.println(environment.calculate(4, 5));
DivideStrategy divideStrategy = new DivideStrategy();
environment.setStrategy(divideStrategy);
System.out.println(environment.calculate(4, 5));
}
}