posts - 297,  comments - 1618,  trackbacks - 0

         策略模式(strategy) 属于对象的行为模式
   1. 定义
        定义一系列的算法,把这些算法一个个封装成单独的类.策略模式是对算法的封装,是把使用算法的责任和算法本身分割开,委派给不同的对象管理.
   2. 使用的原因
        在某些情况下,当客户端需求不同时,会要求不同的算法实现,为使算法的增减,修改都不会影响环境和客户端,可采用策略模式解决此种情况。  
   3. 适用的情况举例
      
1)一电子商务网站对各类书提供不同的折扣算法,有的没有折扣,有的提供10%的折扣,那么在计算图书的价格时,为防止通过过多而扩展性差的选择语句来决定采取何种折扣算法,可采取策略算法有效解决问题;
       2)假使你是一推销员,你脑海中已存储了很多种推销方法,每种方法适应一类人群,当你去推销时,你要根据不同的对象去决定该用何种方式推销;
       3)很多人在追求MM时,会根据不同的MM做出不同的追求策略,有的MM喜欢天南海北的玩,有的MM喜欢肆无忌惮的吃,有的MM喜欢成天成天的打扮,有的......,情场老手会根据具体情况具体分析,而有些不开窍的人,采取统一策略,而且在判断失误时不会做出策略改变,导致屡战屡败,都是因为策略模式没学好的结果(啊哈,跟我一起上补习班)。
   4. 类图结构及说明
        
1) 简略类图
          
       2)说明
            左上边的类为环境(Context)角色,它只有一个Strategy类的应用;
            右上方的类为抽象策略角色,通常为抽象类或接口;
            下方的三个类继承自抽象策略类,它们属于不同的具体策略实现类。它们包装了相关的算法和行为。
   5. 应用举例
        
1)问题背景
             在评议某老师的教学情况时,可能采取如下方式:
             让所教的班的学生对学校定出的评议老师的各项指标进行打分,最后统计该老师所得的平均分数,如果平均分在60分以上,就算教学合格。
            还可能采取如下方式:
            让学生在“合格”、“基本合格”和“不合格”中勾选一项,最后统计认为选择“合格”与“基本合格”的比例,如果超过60%就算教学情况合格。
            还可能有其他种方式。
         2)考虑方案
            a)最不“雅观"的实现方案
                 将所有的业务逻辑都放在客户端中,利用条件选择语句决定使用哪一个算法。
                 缺点:当增加新的方式时,需大量修改客户端代码,使得客户端难以维护。
            b)比a方案进了一步,考虑在客户端加入继承,不同方式的算法在不同的子类中实现,但因此时环境和行为耦合在了一起,造成两者不能单独演化。
            c)针对b方案的环境和行为耦合在一起了这个缺点,将环境和行为分开。环境负责的工作是负责维护和查询行为类,而各行为类负责算法的实现。c方案的实现其实就是策略模式的应用。
        3)代码模拟实现
               待补充。
参考书籍:《Java与模式》
                    《Patterns in Java》

posted on 2007-04-11 00:11 阿蜜果 阅读(2322) 评论(17)  编辑  收藏 所属分类: Design Pattern


FeedBack:
# re: 设计模式学习笔记--策略模式(待续)
2007-04-11 00:16 | αβγ
沙发  回复  更多评论
  
# re: 设计模式学习笔记--策略模式(待续)
2007-04-11 00:24 | αβγ
期待完善。希望能提供实例。  回复  更多评论
  
# re: 设计模式学习笔记--策略模式(待续)
2007-04-11 08:52 | 阿蜜果
呵呵,昨晚累了,今晚继续,啊哈
今日广州阳光真好噢!  回复  更多评论
  
# re: 设计模式学习笔记--策略模式(待续)
2007-04-11 09:13 | 刘甘泉
我来给个实例
//A策略
public class Astragety implements Istragety{

public String doSomething(String ori) {
return ori+"AA";
}
}
//B策略
public class Bstragety implements Istragety{
public String doSomething(String ori) {
return ori+"BB";
}
}
//策略接口
public interface Istragety {
public String doSomething(String ori);
}
//使用策略的上下文
public class StragetyContext {
private Istragety istragety;

public void setIstragety(Istragety istragety) {
this.istragety = istragety;
}

public void doWhatUWant(){
System.out.println(istragety.doSomething("what u want:"));
}
}

//开始使用吧~~~~~
public class Stragety {
public static void main(String[] args) {
StragetyContext stragetyContext = new StragetyContext();
stragetyContext.setIstragety(new Astragety());
stragetyContext.doWhatUWant();
stragetyContext.setIstragety(new Bstragety());
stragetyContext.doWhatUWant();
}
}  回复  更多评论
  
# re: 设计模式学习笔记--策略模式(待续)
2007-04-11 09:20 | 蓝色天空的囚徒
赞一个.  回复  更多评论
  
# re: 设计模式学习笔记--策略模式(待续)
2007-04-11 09:21 | cresposhi
so good  回复  更多评论
  
# re: 设计模式学习笔记--策略模式(待续)
2007-04-11 09:41 | coolfish
学完了策略模式,希望楼主拿 模板方法 模式 做个对比,写点心得. 深入理解 继承和委派的区别.  回复  更多评论
  
# re: 设计模式学习笔记--策略模式(待续)
2007-04-11 10:09 | 刘甘泉
模板模式和策略模式没有相同的东西~~~~~~~
模板模式是用于去除重复代码的。。
策略是用于不同的环境下的不同解决方法  回复  更多评论
  
# re: 设计模式学习笔记--策略模式(待续)[未登录]
2007-04-11 10:30 | 阿蜜果
@coolfish
多谢建议。  回复  更多评论
  
# re: 设计模式学习笔记--策略模式(待续)
2007-04-11 13:48 | @#$%
不错
挺巧的  回复  更多评论
  
# re: 设计模式学习笔记--策略模式(待续)
2007-04-11 17:30 | G_G
我 提个意见 把 
这还有 硬代码的 填充 stragetyContext.setIstragety(new Astragety());

我们可以 用 Spring 来填充它哦!!!

那这个 就无敌了 哈哈   回复  更多评论
  
# re: 设计模式学习笔记--策略模式(待续)
2007-04-11 17:39 | cresposhi
@G_G
大哥,MM是在做设计模式的sample。。。怎么spring都来了。。。
用spring填充那是另外几种模式的结合。。。
顺便说一句IoC也就是DI模式也不是无敌的 :(  回复  更多评论
  
# re: 设计模式学习笔记--策略模式(待续)
2007-04-11 21:22 | 阿蜜果
@@#$%
?巧什么
  回复  更多评论
  
# re: 设计模式学习笔记--策略模式(待续)
2007-04-11 21:26 | 阿蜜果
@刘甘泉
嘻嘻,不错!  回复  更多评论
  
# re: 设计模式学习笔记--策略模式(待续)
2007-04-13 14:08 | hs
八错!八错!  回复  更多评论
  
# re: 设计模式学习笔记--策略模式(待续)[未登录]
2007-11-09 10:51 | Steve
Is this just identical with Bridge Pattern ?  回复  更多评论
  
# re: 设计模式学习笔记--策略模式(待续)[未登录]
2007-11-09 11:04 | 阿蜜果

只有注册用户登录后才能发表评论。


网站导航:
 
<2007年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

      生活将我们磨圆,是为了让我们滚得更远——“圆”来如此。
      我的作品:
      玩转Axure RP  (2015年12月出版)
      

      Power Designer系统分析与建模实战  (2015年7月出版)
      
     Struts2+Hibernate3+Spring2   (2010年5月出版)
     

留言簿(262)

随笔分类

随笔档案

文章分类

相册

关注blog

积分与排名

  • 积分 - 2284416
  • 排名 - 3

最新评论

阅读排行榜

评论排行榜