设计模式之策略模式

来源:互联网 发布:管理员权限安装软件 编辑:程序博客网 时间:2024/06/08 17:52

定义:

它定义了算法家族,分别封装起来,让他们之间可以相互替代,此模式让算法的变化,不会影响到使用算法的客户。——大话设计模式

整体架构图:

这里写图片描述

这个模式涉及到三个角色:
环境(Context)角色:持有一个Strategy的引用。
抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

简单实现过程

SuperStarategy 支持所有算法公共接口
public interface SuperStarategy {

public void getResult(double money);

}
具体算法类:封装具体的算法和行为
StarategyA和
StarategyB
public class StarategyA implements SuperStarategy{

public void getResult(double money) {     System. out.println("策略A...." );}

}
public class StarategyB implements SuperStarategy{

public void getResult(double money) {     System. out.println("策略B。。。" );}

}
定义一个上下文来维护具体算法的配置:
ContextStarategy:

public class ContextStarategy {
private SuperStarategy starategy;
public ContextStarategy (SuperStarategy starategy){
this.starategy =starategy ;
}

public void getResult(double money){      starategy.getResult(money);}

}

客户端调用;

public static void main(String[] args) {     StarategyA starategy= new StarategyA();     ContextStarategy contextStarategy= new ContextStarategy(starategy);     contextStarategy.getResult(100);}

使用场景:
考虑即将到来4月23日读书日,某书店c促销打折:
方案1:全场打8折,
方案2:满一百减30,
方案3:满两百送购书卷100.

源码:
/*策略接口/
public interface BookStarategy {

/**h获取打折后的价格*/public double getPrice(double money);

}

/*第一种打折方案 全场打8折/
public class StarategySchemeA implements BookStarategy{

public double getPrice(double money) {      return money*0.8;}

}
/* 方案2:满一百减30 /
public class StarategySchemeB implements BookStarategy {

public double getPrice(double money) {      return money > 100 ? money - 30 : money;}

}

/*方案3:满三百送购书卷100/
public class StarategySchemeC implements BookStarategy {

public double getPrice(double money) {      return money-100;}

}
客户调用:
StarategySchemeA schemeA=new StarategySchemeA();
ContextBookStarategy bookStarategy=new ContextBookStarategy(schemeA);

策略模式的优点  (1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
  (2)使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。
策略模式的缺点  (1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。
  (2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。

1 0
原创粉丝点击