`
xiaoqulai
  • 浏览: 75200 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
han
文章分类
社区版块
存档分类
最新评论

我理解的JAVA策略模式Strategy Pattern,跟你有没有共鸣?是对是错?

阅读更多
我理解的JAVA策略模式Strategy Pattern(设计原则 多用组合,少用继承)
没有一定程序开发的经验,可能会看不懂,有开发经验的话,会跟偶有共鸣,有非常丰富的开发经验的话,会非常不屑,你是哪种啊,呵呵。

    * 世界上的一部分对象,被归结为一个类别,于是有了类

    * 但类中的对象都有细微的差别,包括特性(属性)和行为(方法),于是有了接口和抽象类,并产生OO的三大特性:封装,继承,多态(有书上说四大特性,还包括抽象)

    * 类是对特性和行为的封装,接口和抽象类是体现差异化,通过继承来实现多态

    * JAVA中的类继承抽象类的缺陷在于,两个不同的子类可能有不同的行为,而都继承一个抽象类,则表现为,一个子类分明没有某一行为,但因为继承了抽象类,它必须实现这一抽象行为,却什么也不做,这不是一个好的策略。

    * 于是有了接口,同一类的不同子类因为有不同的行为,可以将所有子类共同的行为抽象出来,放在抽象父类中来继承,不同的行为在放在不同的接口中来实现,这样看来,貌似是一个很好的设计策略,其实仍有一个很大的缺陷,如果有20个子类同时具有某一接口的特性,那么这一特性要被实现20次,这将出现大量的重复设计。

    * 于是,策略模式闪亮登场。将这些被大量重复的行为剥离出来,另建一个对应于原类的“行为类”,并让原类拥有一个行为类的依赖,当调用原类的某一行为时,事实上是委托其依赖的行为类上的对应的方法。

    * 策略模式的好处在于,将子类中共同的行为剥离出来,放在行为类中,让子类动态的绑定行为类,多个子类具有相同的行为,就可以绑定用一个行为类,而不必全部实现某一接口。更重要的意义在于,这是一种松耦合的设计原则,采用了组合代替继承的方式。每个子类都可以动态的定制行为类


分享到:
评论
9 楼 starffly 2010-06-26  
不就是函数指针么。
8 楼 slaser 2010-06-25  
xiaoqulai 写道
sea7 写道
xiaoqulai 写道
    * JAVA中的类继承抽象类的缺陷在于,两个不同的子类可能有不同的行为,而都继承一个抽象类,则表现为,一个子类分明没有某一行为,但因为继承了抽象类,它必须实现这一抽象行为,却什么也不做,这不是一个好的策略。


这不是继承的缺陷,而是你设计的缺陷。你的设计本身就违反了LSP(子类必须能够替换父类)。


这是继承这种对象特性的缺陷。公鸭和母鸭都是鸭,公鸭当然能替换鸭了(子类必须能够替换父类),但公鸭没有下蛋的方法,母鸭有,可以通过设计比如采用策略模式来弥补。

你搞错了。策略模式解决的是下什么蛋,怎么下单,不是下不下蛋的问题。
7 楼 slaser 2010-06-25  
xiaoqulai 写道
sea7 写道
xiaoqulai 写道
    * JAVA中的类继承抽象类的缺陷在于,两个不同的子类可能有不同的行为,而都继承一个抽象类,则表现为,一个子类分明没有某一行为,但因为继承了抽象类,它必须实现这一抽象行为,却什么也不做,这不是一个好的策略。


这不是继承的缺陷,而是你设计的缺陷。你的设计本身就违反了LSP(子类必须能够替换父类)。


这是继承这种对象特性的缺陷。公鸭和母鸭都是鸭,公鸭当然能替换鸭了(子类必须能够替换父类),但公鸭没有下蛋的方法,母鸭有,可以通过设计比如采用策略模式来弥补。

你设计错误了,鸭不能有下蛋的方法。下单有单独的下单nable的接口。
6 楼 exloong 2010-06-25  
    * JAVA中的类继承抽象类的缺陷在于,两个不同的子类可能有不同的行为,而都继承一个抽象类,则表现为,一个子类分明没有某一行为,但因为继承了抽象类,它必须实现这一抽象行为,却什么也不做,这不是一个好的策略。

   这个不是类继承的缺陷,而是设计问题,父类中的行为子类必须具有,否则这个父类设计上就有问题。

    * 于是有了接口,同一类的不同子类因为有不同的行为,可以将所有子类共同的行为抽象出来,放在抽象父类中来继承,不同的行为在放在不同的接口中来实现,这样看来,貌似是一个很好的设计策略,其实仍有一个很大的缺陷,如果有20个子类同时具有某一接口的特性,那么这一特性要被实现20次,这将出现大量的重复设计。

   这个又是一个设计问题,如果20个子类具有同一接口特征,这20个子类应再从同一个父类中派生
5 楼 xiaoqulai 2009-08-12  
sea7 写道
xiaoqulai 写道
    * JAVA中的类继承抽象类的缺陷在于,两个不同的子类可能有不同的行为,而都继承一个抽象类,则表现为,一个子类分明没有某一行为,但因为继承了抽象类,它必须实现这一抽象行为,却什么也不做,这不是一个好的策略。


这不是继承的缺陷,而是你设计的缺陷。你的设计本身就违反了LSP(子类必须能够替换父类)。


这是继承这种对象特性的缺陷。公鸭和母鸭都是鸭,公鸭当然能替换鸭了(子类必须能够替换父类),但公鸭没有下蛋的方法,母鸭有,可以通过设计比如采用策略模式来弥补。
4 楼 sea7 2009-08-05  
xiaoqulai 写道
    * JAVA中的类继承抽象类的缺陷在于,两个不同的子类可能有不同的行为,而都继承一个抽象类,则表现为,一个子类分明没有某一行为,但因为继承了抽象类,它必须实现这一抽象行为,却什么也不做,这不是一个好的策略。


这不是继承的缺陷,而是你设计的缺陷。你的设计本身就违反了LSP(子类必须能够替换父类)。
3 楼 zhengsiry 2009-08-04  
老觉得java里面抽象类的方法必须统统实现很无聊,习惯了C++编程,对这点很费解。不过后来学了接口和策略,发现java还是略胜一筹
2 楼 xiaoqulai 2009-08-03  
yangyi 写道
简单的说:
策略模式,就是将军定战略,指挥官定策略的过程,其中将军是调度类,指挥官是策略接口或抽象类,坦克指挥官是子类
模板方法模式,就是指挥官必须是将军,其他同上
两者面向的问题领域是一致的


指挥官必须是将军? 坦克指挥官吧。
按你说的,模板模式就是一个简单的继承关系?
1 楼 yangyi 2009-08-03  
简单的说:
策略模式,就是将军定战略,指挥官定策略的过程,其中将军是调度类,指挥官是策略接口或抽象类,坦克指挥官是子类
模板方法模式,就是指挥官必须是将军,其他同上
两者面向的问题领域是一致的

相关推荐

    策略模式 Strategy Pattern

    ### 策略模式 Strategy Pattern #### 概述 策略模式是一种行为设计模式,它使得算法可以在运行时被更改。这种模式允许一个类的行为或其算法在运行时根据需要进行改变,通过这种方式,我们可以轻松地扩展不同的算法...

    【Java设计模式】(2)策略模式Strategy

    策略模式(Strategy)是软件设计模式中的一种行为模式,它使你能在运行时改变对象的行为。在Java中,策略模式通常涉及定义一系列算法,并将每个算法封装起来,使得它们可以相互替换,同时使得算法的变化独立于使用它...

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

    在策略模式中,有三个主要角色:策略接口(Strategy Interface)、具体策略类(Concrete Strategy Classes)和上下文(Context)。策略接口定义了所有支持的算法的公共接口,这样上下文就可以通过这个接口来调用这些...

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

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

    java 策略模式

    总的来说,Java中的策略模式是一种非常实用的设计模式,它有助于我们编写更加灵活、可扩展和易于维护的代码。在实际开发中,特别是在需要处理多种算法或策略的场景下,策略模式的应用可以大大提高代码的可读性和可...

    java 策略模式的小例子

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式主要通过接口或抽象类来定义一系列的算法,并将每个算法封装起来,使得它们可以互相替换,让算法独立于使用它的客户。下面我们将...

    java策略模式小例子

    通过分析`Strategy_Game`中的代码,我们可以深入理解策略模式的工作原理及其在实际问题中的应用。无论你是初学者还是经验丰富的开发者,这个例子都值得一看,因为它以简洁的方式阐述了这个强大的设计模式。

    java策略模式示例.zip

    总的来说,这个"java策略模式示例"是一个很好的学习资源,通过实践可以深入理解策略模式的精髓,提高软件设计能力。在学习过程中,建议动手编写代码,模仿示例,甚至尝试创建自己的策略,以巩固理论知识并提升编程...

    Java策略模式+案例

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式允许我们定义一组算法或策略,并将每个策略...这有助于深入理解策略模式,并能将其运用到自己的项目中,提高代码的灵活性和可维护性。

    Java 设计模式 策略模式

    对于初学者来说,这是一个很好的资源,可以帮助理解策略模式的工作原理和应用场景。如果你在阅读过程中遇到问题或有其他疑问,可以在评论区留言,以便获得帮助。 总之,策略模式是一种强大的设计模式,它鼓励我们...

    策略(strategy)模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。 在策略模式中,我们创建表示各种策略的对象和一个行为根据...

    Java 设计模式-策略模式(Strategy)Android讲解

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式是通过定义一系列算法,并将每个算法封装起来,使它们可以相互替换,让算法独立于使用它的客户而变化。这种模式在Android开发中...

    JAVA_Strategy.rar_java 策略模式、工厂模式、桥接模式_severalgdo_strategy

    在"JAVA_Strategy.rar"这个压缩包中,severalgdo_strategy可能包含了一些示例代码或者教程,用于演示如何在Java项目中实施策略模式、工厂模式和桥接模式。解压并学习这些资源,可以帮助你深入理解这些模式的实现细节...

    Java策略模式Demo

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式主要通过定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法独立于使用它的客户而变化。这种模式的核心是策略...

    《JAVA与模式》之策略模式

    javase 设计模式的strategy pattern《JAVA与模式》之策略模式详解

    java 策略模式demo

    Java策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式通常通过定义一系列算法类并让它们之间可以互换来实现。这种模式的关键在于将算法的使用与算法的实现分离开来,使得系统能够...

    java策略模式源代码

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式主要通过定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法独立于使用它的客户而变化。这种模式的核心在于...

    java设计模式之策略模式与模板模式

    在Java编程领域,设计模式是解决常见问题的可重用解决方案,它们代表了软件设计的最佳实践。本篇文章将深入探讨两种重要的设计模式:策略模式和模板模式。通过理解这两种模式,开发者可以更好地组织代码,提高代码的...

    策略模式在实际项目中的应用二

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式通过定义一系列的算法,并将每一个算法封装起来,使它们可以相互替换,让算法独立于使用它的客户而变化。这种模式通常用于处理多种...

    策略模式的实现,通过反射

    首先,我们理解策略模式的基本结构。策略模式包含三个主要角色:策略接口(Context)、具体策略类(Concrete Strategies)以及上下文(Strategy)。策略接口定义了所有支持的算法的公共接口,具体策略类实现了这个...

Global site tag (gtag.js) - Google Analytics