设计模式之策略模式

    策略模式(别名:政策)
   定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
   策略模式是处理算法的不同变体的一种成熟模式,策略模式通过接口或抽象类封装算法的标识,即在接口中定义一个抽象方法,实现该接口的类将实现接口中的抽象方法。
   在策略模式中,封装算法标识的接口称作策略,实现该接口的类称作具体策略。
策略模式的结构中包括三种角色:
  策略(Strategy)
•  具体策略(ConcreteStrategy)
•  上下文(Context)
  上下文(Context)和具体策略(ConcreteStrategy)是松耦合关系。因此上下文只知道它要使用某一个实现Strategy接口类的实例,但不需要知道具体是哪一个类。
  策略模式满足“开-闭原则”。当增加新的具体策略时,不需要修改上下文类的代码,上下文就可以引用新的具体策略的实例。
适合使用策略模式的情景:
•一个类定义了多种行为,并且这些行为在这个类中以多个条件语句的形式出现,可以使用策略模式避免在类中使用大量的条件语句。
•程序不需要暴露复杂的、与算法相关的数据结构,可以使用策略模式封装算法。
•需要使用一个算法的不同变体。
实例:


•把数组导出为表格的算法,输入一个数组,导出一个表格,当用户想改变导出的表格时,便可以通过改变输出的算法改变输出的结果。如果输出的内容用以网页显示,则输出
 <table><tr><td>Jack</td></tr><tr><td>Maya</td></tr><tr><td>Mikes</td></tr><tr><td>Shadow</td></tr></table>
•如果输出的结果用以直接的屏幕输出,则可以输出:
     +----+----+-----+------+
     |Jack|Maya|Mikes|Shadow|
     +----+----+-----+------+
完整代码如下:
第一步:定义接口:
public interface TableExporter {
       public String getExported(String data[]);
}
第二步:实现接口(html):
public class HtmlExporter implements TableExporter{
     @Override
public String getExported(String[] data) {
if(data==null)
return "";
StringBuffer sb=new StringBuffer();
sb.append("<table>");
for(int i=0;i<data.length;i++)
sb.append("<tr><td>"+data[i]+"</td></tr>");
sb.append("</table>");
return sb.toString();
}
}
第三步:实现接口(Line):
public class LineExporter implements TableExporter{


@Override
public String getExported(String[] data) {
if(data==null) return "";
StringBuffer top=new StringBuffer("+");
StringBuffer mid=new StringBuffer("|");
for(int i=0;i<data.length;i++){
String str=data[i];
for(int j=0;j<str.length();j++)
top.append("-");
mid.append(str);
top.append("+");
mid.append("|");
}
top.append("\n");
mid.append("\n");
return top.toString()+mid.toString()+top.toString();
}
}
第四步:定义上下文类:
public class Context {
      TableExporter t;
      public void setExporter(TableExporter t){
     this.t=t;
      }
 public String getExporter(String data[]){
 return t.getExported(data);
 } 
      
}
第五步:主方法:
public class Client {


public static void main(String[] args) {
// TODO Auto-generated method stub
          String data[]=new String[]{"Jack","Maya","Mike","Shadow"};
          Context c=new Context();//上下文
          //使用网页形式输出
          TableExporter tb=new HtmlExporter();
          c.setExporter(tb);
          System.out.println(c.getExporter(data));
}
}

  

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值