`
scnujie
  • 浏览: 127812 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

阅读更多
   今天从图书馆借了本 Head First设计模式,小看了一章,感觉挺不错的所以写下来当作备忘:

   书里关于这个模式的定义是:定义了算法族,分别封闭起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户.以下是一个简单的实例,具体的流程是:

   先把公共的信息定义在一个父类或者是父接口中,该父类或者父接口中的变量用的都是接口类型(这些接口类型都有其实现的具体子类,暂称为a吧),然后在实现或者继承了父接口或者父类的子类(暂称为b)中针对的是父类或者父接口中的接口进行编程,最后在测试类或者是具体功能类中只需实例化a后赋给针对接口类型编程的地方,这样一来就可以实现具体算法与具体用户之间的独立和替换;


首先是父接口:

 
package com.jie.pattern;

public interface Duck {
	
	public IFly fly=null;  //这里两个都是接口类型
	public ICry cry=null;  //
	
    public void display();
}


接着是两个接口的定义:

 
package com.jie.pattern;

public interface IFly {
	
	public void fly();

}

 package com.jie.pattern;

public interface ICry {

	public void cry();
}

然后是实现了父接口的子类:

 package com.jie.pattern;

public class FlyDuck implements Duck{

	public IFly fly=null;
	
	public FlyDuck()
	{
	}
	
	public void setFly(IFly fly)
	{
		this.fly=fly;
	}
	
	public void fly()
	{
		fly.fly();
	}
	
	public void display()
	{
		System.out.println("Fly's duck...");
	}
}


然后是实现了接口的具体类:

 package com.jie.pattern;

public class FlyDuck implements Duck{

	public IFly fly=null;
	
	public FlyDuck()
	{
	}
	
	public void setFly(IFly fly)
	{
		this.fly=fly;
	}
	
	public void fly()
	{
		fly.fly();
	}
	
	public void display()
	{
		System.out.println("Fly's duck...");
	}
}


最后当然少不了一个测试类:

 
package com.jie.pattern;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	FlyDuck flyDuck=new FlyDuck();
	flyDuck.setFly(new SubFly());//这里可以用实现了接口的具体类的实例来进行替代;
	flyDuck.fly();
	}

}


分享到:
评论
20 楼 nba520pz 2009-01-24  
package com.jie.pattern;  
 
public interface Duck {  
      
    public IFly fly=null;  //这里两个都是接口类型  
     public ICry cry=null;  //  
      
    public void display();  


这个接口中放两个常量干嘛?这两个默认的可是static final类型的,
不需要的!
19 楼 nba520pz 2009-01-24  
建议看看《深入浅出设计模式》!
18 楼 superscorpio 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  上面的例子还有很强的耦合。为了解耦,请使用类反射器解耦。


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

17 楼 yunhaifeiwu 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  上面的例子还有很强的耦合。为了解耦,请使用类反射器解耦。
16 楼 yunhaifeiwu 2008-12-08  
对楼主说声sorry!把这个模式,看成了模式的定义。结果是策略模式的定义。

对设计模式有三年没复习了,连概念也模糊了!
15 楼 yunhaifeiwu 2008-12-08  
书里关于这个模式的定义是:定义了算法族,分别封闭起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
===============================================

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

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

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

14 楼 gembler 2008-12-07  
laiseeme 写道
colven 写道
这本书 我也正在看,但是太抽象,我花了两个小时看完,不知所云

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


确实,这书很多地方都是一点即止.
13 楼 JavaFlasher 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);
    }

}




感觉 用的 有点 心虚 。 不知道 哪位知道 地道的用法 。
12 楼 flykete 2008-08-20  
这样就能和设计模式车上关系?秒似你的代码就是个面向接口编程吧,你这套玩意我在spring里天天打交道。
11 楼 风清云淡 2008-08-20  
aninfeel 写道
感觉设计模式几乎都是利用类的继承,用顶层类实现参数或变量的透明。

利用类的继承,兄弟,再好好学习设计模式吧,不懂不要乱说话!
10 楼 aninfeel 2008-08-20  
感觉设计模式几乎都是利用类的继承,用顶层类实现参数或变量的透明。
9 楼 jarwang 2008-08-20  
SubFly
这个类在哪里?

根本连代码都写错。还谈什么收获?
8 楼 liyun_1981 2008-08-20  
我觉得每个人对封装、继承和多态的理解都有所不同,所以就产生了多种设计模式,
设计模式本身没有好坏之分,每个有一定编程经验的人都可以自己写设计模式,而
光靠一种设计模式往往是不能解决实际问题的,评论设计模式的好坏没有任何意义,
关键是看是否能解决或最接近的解决实际问题!
7 楼 laiseeme 2008-08-18  
colven 写道
这本书 我也正在看,但是太抽象,我花了两个小时看完,不知所云

哥们看书太快了吧   我瞎翻都翻了两个礼拜
我觉得这本书讲得够明白了
6 楼 lzycxy 2008-08-18  
设计模式最好结合实际应用来看。
做了一个项目或者模块后,再来看看设计模式,这样比较好点
5 楼 muyannian 2008-08-12  
我看的是大话设计模式,比较好理解,那本翻译过来的我实在不敢恭维,太难理解。
适合自己才是最好的。

这个模式我在php里经常用,偷懒的时候经常这么干,把经常变动的提出来,放到一个方法里,然后继承重写,或放到一个对象里,每次传递过来。
4 楼 colven 2008-08-06  
这本书 我也正在看,但是太抽象,我花了两个小时看完,不知所云
3 楼 ouyang8891 2008-06-14  
不错,我喜欢
2 楼 bloodrate 2008-06-11  
我突然想到一个问题,如果不同算法要求输入的参数不一样,怎么办?
1 楼 scnujie 2008-03-24  
看起来不错.

相关推荐

    设计模式之策略模式(Strategy Pattern)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或时间点执行不同算法的情况。策略模式提供了一种灵活的方式来处理这种情况,通过将每种算法封装为一个...

    设计模式 之 “策略模式[Strategy Pattern]”

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或时间点执行不同算法的情况。策略模式提供了一种将算法族封装到各自独立的类中,并让它们之间可以互相...

    设计模式之策略模式(Strategy Pattern)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件设计中,我们经常遇到需要在不同时间或根据不同条件使用不同算法的情况。策略模式允许我们将算法封装到独立的可互换的策略类中,从而使它们可以...

    策略模式 Strategy Pattern

    策略模式是一种行为设计模式,它使得算法可以在运行时被更改。这种模式允许一个类的行为或其算法在运行时根据需要进行改变,通过这种方式,我们可以轻松地扩展不同的算法而不修改现有代码。 #### 主要问题 在软件...

    设计模式:可复用面向对象软件的基础--详细书签版

     “[设计模式]在实用环境下特别有用,因为它分类描述了一组设计良好,表达清楚的面向对象软件设计模式。整个设计模式领域还很新,本书的四位作者也许已占据了这个领域造诣最深的专家中的半数,因而他们定义模式的方法...

    c++设计模式全系列+应用场景+实例说明

    5. **策略模式(Strategy Pattern)**:策略模式是一种行为设计模式,定义了一系列算法,并使其可以相互替换,使得算法的变化独立于使用算法的客户端。 6. **适配器模式(Adapter Pattern)**:适配器模式是一种...

    Java设计模式之禅

    《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...

    JAVA设计模式例程-策略模式

    在众多的设计模式中,策略模式(Strategy Pattern)是一种行为设计模式,它使你能在运行时改变对象的行为。在这个“JAVA设计模式例程-策略模式”的压缩包中,我们可以深入探讨策略模式的原理及其应用。 策略模式的...

    C#23种设计模式【完整】.pdf

    19. 策略模式(Strategy Pattern):定义一个family of algorithms(算法家族),封装每一个算法,并使它们可以互换。 20. 访问者模式(Visitor Pattern):表示一个作用于某对象结构中的各元素的操作,使得可以在不...

    GOF之23种设计模式的C#实现:DesignPattern.zip

    - 策略模式(Strategy):定义一组可相互替换的算法,并将每一种算法封装起来,使它们可以互相替换。 - 模板方法模式(Template Method):定义一个操作中的算法骨架,而将一些步骤延迟到子类中。 - 访问者模式...

    设计模式--策略模式StrategyPattern

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或场景来执行不同算法的情况。策略模式提供了一种将算法族封装到各自独立的类中,并在运行时选择具体...

    C++设计模式基础教程.pdf

    16. 策略模式(Strategy Pattern):定义一个算法家族,将它们一个个封装,并使它们之间可以互相替换。 学习设计模式的方法 学习设计模式需要积累案例,大量背类图,多思考、多梳理、归纳总结,尊重事物的认知规律...

    Python 程序语言设计模式思路-行为型模式:策略模式:将算法封装成独立的类,并使它们可以互相替换及支付模式数据压缩

    策略模式(Strategy Pattern)是一种行为型设计模式,旨在将算法封装成独立的类,并使它们可以互相替换。这种模式使得算法的变化独立于使用算法的客户端,从而提供了灵活性和可扩展性。策略模式常用于需要在运行时...

    设计模式整理代码-pattern.zip

    这里我们关注的是一个名为"pattern.zip"的压缩包文件,它包含了23种经典的设计模式,这些模式在实践中被广泛使用,提高了代码的可读性、可维护性和可扩展性。这篇文章将详细探讨这些设计模式及其应用。 首先,23种...

    C++设计模式(Design Pattern)范例源代码

    23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm” 供参考。 注:项目在 VS2008 下使用。 创建型: 抽象工厂模式(Abstract Factory) ...

    《设计模式》DELPHI版

    10. 策略模式(Strategy Pattern):定义一系列的算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用它的客户端。Delphi中可以通过多态和函数指针来实现策略模式。 这些设计模式的...

    Java的23种设计模式

    13. 策略模式(Strategy Pattern):定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。 14. 模板方法模式(Template Method Pattern):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 15....

    我们的设计模式(java)

    书中首先介绍了策略模式(Strategy Pattern),这是行为设计模式之一。策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。以诸葛亮给赵云三个锦囊妙计的...

Global site tag (gtag.js) - Google Analytics