<设计模式14>策略模式
2016-09-12 22:18
316 查看
策略模式通常是对算法的一些封装。
通常当一个问题有多个解决方案的时候,我们会通过if-else来对每个方法进行区分,通过传入的参数来确定具体使用某个方法。但是这样做的话耦合性太高,如果条件很多的时候,if-else就会很复杂。当我们需要进行增加或者减少的时候,就需要对代码的逻辑进行更改。这样就违反了开闭原则。
而策略模式,就能很好的解决这种问题,将各种方案分离开来。
策略模式中的各个角色:
Context:用来操作策略的上下文环境
IStragety:策略的抽象
FirstWayStragety、SecondWayStragety:具体的策略实现。
首先实现一个策略的接口
IStragety:public interface IStrategy {
void doSomeThings();
}实现这个接口,也就是各个算法的实现:
FirstWayStragety:
public class FirstWayStrategy implements IStrategy{
@Override
public void doSomeThings() {
System.out.println("第一种处理方式");
}
}SecondWayStragety:
public class SecondWayStrategy implements IStrategy{
@Override
public void doSomeThings() {
System.out.println("第二种处理方式");
}
}
Context:
public class Context {
private IStrategy strategy;
public void set(IStrategy strategy){
this.strategy = strategy;
}
public void doSomethings(){
if(strategy != null){
strategy.doSomeThings();
}
}
}
使用测试:
public class StrategyTest {
public static void main(String[] args) {
<span style="color:#ff0000;">//不使用策略模式</span>
getWay("First");
<span style="color:#ff0000;">//使用策略模式</span>
Context context = new Context();
context.set(new FirstWayStrategy());
context.doSomethings();
}
private static void getWay(String type) {
if("First".equals(type)){
FirstWayStrategy way = new FirstWayStrategy();
way.doSomeThings();
}else {
SecondWayStrategy way = new SecondWayStrategy();
way.doSomeThings();
}
}
}这两种实现结果是一样的,但是虽然不使用策略模式的第一种方法也进行了一层封装,但是里面还是存在复制的if-else,而通过策略模式,通过不同策略的构建来实现了不同算法的替换,当我们新增一个算法的时候,不是去修改if-else的逻辑代码,而是重新实现一个抽象类,这样明显增加了系统的稳定性、扩展性,让业务逻辑更加直观。
通常当一个问题有多个解决方案的时候,我们会通过if-else来对每个方法进行区分,通过传入的参数来确定具体使用某个方法。但是这样做的话耦合性太高,如果条件很多的时候,if-else就会很复杂。当我们需要进行增加或者减少的时候,就需要对代码的逻辑进行更改。这样就违反了开闭原则。
而策略模式,就能很好的解决这种问题,将各种方案分离开来。
策略模式中的各个角色:
Context:用来操作策略的上下文环境
IStragety:策略的抽象
FirstWayStragety、SecondWayStragety:具体的策略实现。
首先实现一个策略的接口
IStragety:public interface IStrategy {
void doSomeThings();
}实现这个接口,也就是各个算法的实现:
FirstWayStragety:
public class FirstWayStrategy implements IStrategy{
@Override
public void doSomeThings() {
System.out.println("第一种处理方式");
}
}SecondWayStragety:
public class SecondWayStrategy implements IStrategy{
@Override
public void doSomeThings() {
System.out.println("第二种处理方式");
}
}
Context:
public class Context {
private IStrategy strategy;
public void set(IStrategy strategy){
this.strategy = strategy;
}
public void doSomethings(){
if(strategy != null){
strategy.doSomeThings();
}
}
}
使用测试:
public class StrategyTest {
public static void main(String[] args) {
<span style="color:#ff0000;">//不使用策略模式</span>
getWay("First");
<span style="color:#ff0000;">//使用策略模式</span>
Context context = new Context();
context.set(new FirstWayStrategy());
context.doSomethings();
}
private static void getWay(String type) {
if("First".equals(type)){
FirstWayStrategy way = new FirstWayStrategy();
way.doSomeThings();
}else {
SecondWayStrategy way = new SecondWayStrategy();
way.doSomeThings();
}
}
}这两种实现结果是一样的,但是虽然不使用策略模式的第一种方法也进行了一层封装,但是里面还是存在复制的if-else,而通过策略模式,通过不同策略的构建来实现了不同算法的替换,当我们新增一个算法的时候,不是去修改if-else的逻辑代码,而是重新实现一个抽象类,这样明显增加了系统的稳定性、扩展性,让业务逻辑更加直观。
相关文章推荐
- <设计模式>(1)策略模式
- <Head First 设计模式>:策略模式--Duck
- <<cocoa设计模式>>
- 黑马程序员 <梦想之旅 > 单例设计模式
- <译>C#使用设计模式和软件设计原则构建应用程序 PartIII
- <Head First 设计模式>:模板方法模式:Beverage
- <Head First 设计模式>:代理模式:proxy
- 浅学设计模式之策略<Strategy>模式及在android中的使用
- 我的<<Head First 设计模式>>读后感整理
- <C/C++ 版> 设计模式 学习之 策略模式+工厂模式
- <Head First 设计模式>:状态模式:GumballMachine
- 设计模式(10)---->策略模式
- <<.NET B/S 架构实践>> 几种概念区别 - 算法、设计模式、企业应用架构模式、架构模式
- <Head First 设计模式>:适配器模式:Adapter
- <总结> 设计模式之 开放封闭原则OCP C++示例
- 设计模式(10)---->策略模式
- <设计模式>之<单一职责原则>
- <黑马程序员>关于享元设计模式
- <Head First 设计模式>:工厂模式2:抽象工厂模式--Pizza
- <Head First 设计模式>:复合模式:duck