您的位置:首页 > 其它

设计模式学习-策略模式

2018-03-18 11:25 609 查看
什么是策略模式:策略模式将可变的部分从程序中抽象分离成算法接口,在该接口下分别封装一系列算法实现并使他们可以相互替换,从而导致客户端程序独立于算法的改变。
策略模式的实现

1、通过分离变化得出的策略接口Strategy
2、Strategy的实现类
3、客户程序“有一个”Strategy
4、在客户程序中选择/组装正确的Strategy实现

策略模式的优点
1、使用了组合,使框架更加灵活
2、富有弹性,可以较好的应对变化(开闭原则)
3、更好的代码复用性(相对于继承)
4、消除大量的条件语句

策略模式的缺点
1、客户代码需要了解每个策略实现的细节
2、增加了对象的数目

策略模式的适用场景
1、许多相关的类仅仅是行为差异
2、运行时选取不同的算法变体
3、运行条件语句在多个分支中选取一

实现我们将创建一个定义活动的 Strategy 接口和实现了 Strategy 接口的实体策略类。Context 是一个使用了某种策略的类。StrategyPatternDemo,我们的演示类使用 Context 和策略对象来演示 Context 在它所配置或使用的策略改变时的行为变化。



还是以简易计算器为例子/**
*
*/
package simplefactory.study.factory;

/**
* @author Byp
*
*/
public interface Operation {

// 获得计算结果
public double getresult(double numberA, double numberB);

}

package simplefactory.study.factory;

public class OperateSub implements Operation {

@Override
public double getresult(double numberA, double numberB) {
double result=numberA-numberB;
return result;
}

}

package simplefactory.study.factory;

public class OperateAdd implements Operation {

@Override
public double getresult(double numberA, double numberB) {
double resule = numberA+numberB;
return resule;
}

}
package simplefactory.study.factory;

public class Context {

private Operation operation;

public Context(Operation operation) {
this.operation = operation;
}

public double result(double numberA, double numberB) {
return operation.getresult(numberA, numberB);
}

}

package simplefactory.study.factory;

public class Test {

public static void main(String[] args) {

Context context = new Context(new OperateAdd());
System.out.println(context.result(14, 17));

}

}
策略模式是一种定义一系列算法的方法,从概念上看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方法调用所有的算法,减少了各种算法类与使用算法类之间的耦合。策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于取出这些算法中的公共功能,另外策略模式还简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息