类的划分原则 面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。
策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
使用策略模式可以把行为和环境分割开来。环境类负责维持和查询行为类,各种算法则在具体策略类( ConcreteStrategy) 中提供。 由于算法和环境独立开来,算法的增减、修改都不会影响环境和客户端。当出现新的促销折扣或现有的折扣政策出现变化时,只需要实现新的策略类,并在客户端登记即可。策略模式相当于"可插入式(Pluggable)的算法"。 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开,委派给不同的对象管理。 ”准备一组算法,并将每一个算法封装起来,使得它们可以互换。
环境(Context) 角色:持有一个Strategy类的引用(上下文对象),负责和具体的策略类交互。 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接只。 具体策略(ConcreteStrategy) 角色:包装了相关的算法或行为。
策略模式功能:把具体算法从具体业务处理中独立 策略模式与if-else语句:多个if-else出现考虑使用策略模式 算法的平等性:策略算法是形同行为的不同实现 谁来选择具体策略算法:客户端;由上下文来选择具体的策略算法
出现同关个算法,有很多不同的实现的情况,可以使用策略模式来把这些“不同的实现”实现成为一个算法的类层次 出现抽象一个定义了很多行为的类,并且是通过多个if-else语句来选择这些行为的情况,可以使用策略模式来代替这些条件语句
本质:分离算法,选择实现。
优点:
缺点:
优点:
缺点:
UML图:
策略接口,抽象和接口都可以
package 策略模式;
public abstract class Strategy {
abstract public void realize_Strategy();
}
//具体的策略A
package 策略模式;
public class Concrete_Strategy_A extends Strategy {
@Override
public void realize_Strategy() {
System.out.println("具体策略A的实现");
}
}
//具体的策略B
package 策略模式;
public class Concrete_Strategy_B extends Strategy {
@Override
public void realize_Strategy() {
System.out.println("具体策略A的实现");
}
}
上下文类
package 策略模式;
public class Context {
private Strategy str;
public Context(Strategy str) {
this.str = str;
}
public void Context_Method()
{
str.realize_Strategy();
}
}
package 策略模式;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Context con;
Strategy strA = new Concrete_Strategy_A();
con = new Context(strA);
con.Context_Method();
Strategy strB = new Concrete_Strategy_B();
con = new Context(strB);
con.Context_Method();
}
}