论坛首页 Java企业应用论坛

设计模式一:策略模式(Strategy Pattern)

浏览 10169 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (2)
作者 正文
   发表时间:2008-08-20  
aninfeel 写道
感觉设计模式几乎都是利用类的继承,用顶层类实现参数或变量的透明。

利用类的继承,兄弟,再好好学习设计模式吧,不懂不要乱说话!
0 请登录后投票
   发表时间:2008-08-20  
这样就能和设计模式车上关系?秒似你的代码就是个面向接口编程吧,你这套玩意我在spring里天天打交道。
0 请登录后投票
   发表时间:2008-12-06  
bloodrate 写道
我突然想到一个问题,如果不同算法要求输入的参数不一样,怎么办?


我也考虑到这个问题,书上说 策略模式有三种角色 :

1:环境(context)角色 : 持有对 策略类的引用
2:抽象策略角色
3:具体策略角色


但具体策略角色 参数可能不相同,可能引入 个性参数 ,比如 卖书打折那个例子 。

这时候  环境角色 那个 类真不知道怎么写好 ?

我 干脆 都没写 直接 就 用了 。

单元测试类 :

public class DiscountTest extends TestCase {

    public void testMain() {
        //总额百分比 策略
        NoDiscountStrategy discountStrategy = new NoDiscountStrategy(32.5, 24);


//        //固定折扣额 策略
//        FlatRateStrategy discountStrategy = new FlatRateStrategy(32.5, 24);
//        discountStrategy.setAmmount(2);

//        //总额百分比 策略
//        PercentageStrategy discountStrategy = new PercentageStrategy(32.5,24);
//        discountStrategy.setPercent(0.85);


        double discount = discountStrategy.calculateDiscount();
        System.out.println(discountStrategy.getClass().getName() + "  折扣额为 : " + discount);
    }

}




感觉 用的 有点 心虚 。 不知道 哪位知道 地道的用法 。
0 请登录后投票
   发表时间:2008-12-07  
laiseeme 写道
colven 写道
这本书 我也正在看,但是太抽象,我花了两个小时看完,不知所云

哥们看书太快了吧   我瞎翻都翻了两个礼拜
我觉得这本书讲得够明白了


确实,这书很多地方都是一点即止.
0 请登录后投票
   发表时间:2008-12-08   最后修改:2008-12-08
书里关于这个模式的定义是:定义了算法族,分别封闭起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
===============================================

看到这个定义,就感觉眼界不远,思想不深!所站的角度,就不像站在软件设计这个解度看问题。 打开软件设计教本,软件开发,是从需求到代码,一步步进行推演,最后进入维护直到软件生命结束。也就是说,软件设计,首要的是面对需求,不是代码。此书,直接把与代码相关的算法,进行定义,可见其眼界之远近,思维之深度。 按他的这个重视角度上看,各位应先找出一大堆算法,然后进行封装。晕,这是写算法包,还是写函数包? 好像与我们见到的软件设计有点不一样吧?首先,我们接到一个客户的单,问清要求,然后进行调查,然后再进行软件设计。可不是一来,就封装一大堆算法。

我所见到的设计模式书,李建忠的讲义(不好意思,不是他的粉丝,也不推销它的书,本人当年是在网上当的),张口闭口都是需求,然后是UML的类图,然后是代码实现。

虽然从某个角度上说,这种理解也有道理,但是并没有站在软件设计这个角度上的,因此我认为把这本书不看也罢!

0 请登录后投票
   发表时间:2008-12-08  
对楼主说声sorry!把这个模式,看成了模式的定义。结果是策略模式的定义。

对设计模式有三年没复习了,连概念也模糊了!
0 请登录后投票
   发表时间:2008-12-10   最后修改:2008-12-10
这是具体教材
http://tech.ddvip.com/2008-11/122584658688974.html

下面是uml类图


根据类图,作出下面个的观察总结与理解:

策略模式, 具体策略类ConcreteStrategyA 、ConcreteStrategyB、。。。。他们都有同名同参数的方法,
仅实现不同。

在Context类中,需要给它注入(或生成)策略对象( 即ConcreteStrategyA 、ConcreteStrategyB、。。。。的对象
concreteStrategyA 、concreteStrategyB、。。。。) .


在Context类中,再使用这些具体策略类对象的方法。

从实现角度上总结:类对象注入(或生成)。与所注入的对象相对应的类 仅仅是封装了相同形式但不同算法罢了。没有什么好神秘的。

一种运用场景, 根据不同条件,运用不同的策略.如:游戏中,如果是怕火的人,就用火攻的策略,如果是怕毒的人,就用毒气。 如果用伪java解说,则如下

  public class ConcreteStrategy {
          puvlic void 攻击(){};
        
   }
   public class ConcreteStrategy火 extends ConcreteStrategy {
          puvlic void 攻击(){
             //发出三昧真火
          };
        
   }
    public class ConcreteStrategy毒 extends ConcreteStrategy {
          puvlic void 攻击(){
             //发出唐门无色无味,闻着倒
          };
        
   }
   public class content {
       
       public void 战场( String 敌人特征){
           if (敌人特征==("怕火")){
                ConcreteStrategy 自已的策略= new  ConcreteStrategy火();
                自已的策略.攻击();
           }
           if (敌人特征=="怕毒"){
                ConcreteStrategy 自已的策略= new  ConcreteStrategy毒();
                自已的策略.攻击();
           }
       } 
   }   


说明: 1 上面不是java语言,为了解说而使用类似java语法的形式说明。其中<敌人特征==("怕火")>中,关于字符串用等于符号,在java中是非常不对的。
      2  上面的例子还有很强的耦合。为了解耦,请使用类反射器解耦。
0 请登录后投票
   发表时间:2008-12-24  
yunhaifeiwu 写道
这是具体教材
http://tech.ddvip.com/2008-11/122584658688974.html

下面是uml类图


根据类图,作出下面个的观察总结与理解:

策略模式, 具体策略类ConcreteStrategyA 、ConcreteStrategyB、。。。。他们都有同名同参数的方法,
仅实现不同。

在Context类中,需要给它注入(或生成)策略对象( 即ConcreteStrategyA 、ConcreteStrategyB、。。。。的对象
concreteStrategyA 、concreteStrategyB、。。。。) .


在Context类中,再使用这些具体策略类对象的方法。

从实现角度上总结:类对象注入(或生成)。与所注入的对象相对应的类 仅仅是封装了相同形式但不同算法罢了。没有什么好神秘的。

一种运用场景, 根据不同条件,运用不同的策略.如:游戏中,如果是怕火的人,就用火攻的策略,如果是怕毒的人,就用毒气。 如果用伪java解说,则如下

  public class ConcreteStrategy {
          puvlic void 攻击(){};
        
   }
   public class ConcreteStrategy火 extends ConcreteStrategy {
          puvlic void 攻击(){
             //发出三昧真火
          };
        
   }
    public class ConcreteStrategy毒 extends ConcreteStrategy {
          puvlic void 攻击(){
             //发出唐门无色无味,闻着倒
          };
        
   }
   public class content {
       
       public void 战场( String 敌人特征){
           if (敌人特征==("怕火")){
                ConcreteStrategy 自已的策略= new  ConcreteStrategy火();
                自已的策略.攻击();
           }
           if (敌人特征=="怕毒"){
                ConcreteStrategy 自已的策略= new  ConcreteStrategy毒();
                自已的策略.攻击();
           }
       } 
   }   


说明: 1 上面不是java语言,为了解说而使用类似java语法的形式说明。其中<敌人特征==("怕火")>中,关于字符串用等于符号,在java中是非常不对的。
      2  上面的例子还有很强的耦合。为了解耦,请使用类反射器解耦。


这位同学讲的在理。 幽默啊!

0 请登录后投票
   发表时间:2009-01-24  
建议看看《深入浅出设计模式》!
0 请登录后投票
   发表时间:2009-01-24  
package com.jie.pattern;  
 
public interface Duck {  
      
    public IFly fly=null;  //这里两个都是接口类型  
     public ICry cry=null;  //  
      
    public void display();  


这个接口中放两个常量干嘛?这两个默认的可是static final类型的,
不需要的!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics