`
franktony
  • 浏览: 13418 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

策略 - 鸭子的不同行为

阅读更多

抽象的鸭子,有几个子鸭子类继承了
来了个变态需求:我们要鸭子会飞(本人见过)


比较好想的解决方法是:在抽象鸭子中加个fly方法
解决了,生活真美好,感谢继承感谢cctv

有看官说了:等等,我家儿子的橡胶玩具鸭子也继承了你那个类了,它不会飞啊
...... 呃,在你的玩具鸭子上覆写fly方法就好了嘛,表烦我

我们家还有诱饵鸭子,不飞也不叫,木头的

...... 你家鸭子真BT

教训:在超类上加上新的行为,会使某些不适合该行为的子类也具有该行为

看来维护的时候,为了reuse而使用的继承,还真有点问题

 

大师原则:针对接口编程

好的,我把fly从抽象鸭子里提出来放在个接口里,想飞的鸭子去实现吧 

但是,太多的鸭子类可能要写相同的fly方法,代码太多了吧,呃。。。好像还不如继承来的方便

 

大师原则:多用组合,少用继承

is-a和has-a,不继承的话,我们就has-a吧

OK,接口仍然存在,想飞的鸭子类可以持有该接口做为一个属性,并且委托接口的不同实现去fly

不管你是想用翅膀飞,还是想坐飞机飞,还是火箭动力飞,只要把不同的实现插接到鸭子上,

而鸭子代码不用做任何改变就可以随便怎么飞,这就是抽象的好处

 

大师原则:封装变化

呃。。。。那不用继承,抽象鸭子类也应该做成接口吗?

我们处理的变化的部分,固定不变的部分,让它们被继承好了,我们甚至可以把被继承的类做成具体类。

我们不可能预料到所有的变化,如果出现了新了变化,做上面同样的处理就是了。

目前,我们解决了原先变化的问题,这样就可以了,要有个度,没有必要全部来抽象,会提高不必要的复杂度。 

关键:处理变化的部分

 

而飞的行为被抽出来,跟鸭子没有什么关系。

老母鸡也想飞?OK,用飞的接口声明个属性去,我这里有翅膀火箭喷气等等各种飞,拿去插到你的类中

 

面向对象向我们承诺了“复用”,有很多方法,但继承是种强耦合,所以我们用组合

 

OO强烈追求的目标是:解耦,把会变化的部分抽出并封装起来,

以期让系统中某部分的改变不影响到其它部分,几乎每个模式都体现出这种精神,并提供一种方式来实现此目标。

 

这里,我们得到了“策略”模式

正式定义是:策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,

此模式让算法的变化独立于使用算法的客户

 

ps:这是我最喜欢的模式

 





 

 

分享到:
评论

相关推荐

    设计模式之策略模式 鸭子问题

    设计模式之策略模式 鸭子问题 策略模式是一种经典的设计模式,通过鸭子问题,可以让学习者更好地了解设计模式的概念和实现。策略模式的主要思想是定义一系列的算法,并将每一个算法封装起来,使它们可以相互替换。...

    实验一:鸭子游戏-策略模式.rar

    具体的鸭子类型(例如"红头鸭"、"绿头鸭")会实现这些行为的不同策略。 下面是一些关键知识点: 1. **策略接口**:定义了所有支持的策略的公共接口,通常包含一系列相关操作的方法。 2. **具体策略类**:实现了...

    C#,设计模式,策略模式,鸭子,

    在这个例子中,有不同类型的鸭子,每种鸭子可能有不同的行为方式。例如,有的鸭子会飞,有的鸭子不会飞;有的鸭子会嘎嘎叫,有的鸭子会发出其他声音。这些不同的行为可以被视为策略,每种策略由一个独立的类来实现。...

    设计模式解读之一: 策略模式——鸭子游戏.doc

    设计模式解读之一:策略模式...这在鸭子游戏中非常有用,因为我们可以根据不同的鸭子类型选择不同的飞行动作。 策略模式是解决鸭子游戏中问题的一种非常好的方法。它使我们可以灵活地更换算法,而不需要修改原始代码。

    设计模式---策略者模式

    书中的例子可能是一个关于鸭子模拟的场景,不同的鸭子有不同的叫声、飞行方式等行为。这些行为可以看作是策略,每种策略对应一个独立的类,如QuackBehavior(呱呱叫行为)和FlyBehavior(飞行行为)。鸭子对象则持有...

    深入浅出设计模式(C#版)--策略模式--示例代码

    通过这种方式,策略模式使得鸭子的行为可以根据环境动态调整,比如让一只通常会飞的鸭子在特定情况下无法飞行,只需要在运行时更改它的飞行策略即可。 在`DuckTest`这个例子中,我们可能会创建各种鸭子实例,并通过...

    根据策略模式,设计并实现模拟鸭子程序

    请根据策略模式,设计并实现模拟鸭子程序。其中,部分代码已经写好,包括: 主程序 "飞行”行为接口 "叫”行为接口 鸭子的基类 请在此框架下,继续完成MallardDuck、RubberDuck、DecoyDuck和ModelDuck等子类,以及...

    策略模式-java

    3. **上下文**(Context):使用策略接口定义的算法或行为,并且可以根据需要更换不同的策略。 #### 应用场景与问题缘起 假设我们需要开发一个游戏,其中包含多种不同类型的鸭子,如野鸭、红头鸭、橡皮鸭等。每种...

    关于鸭子的问题 策略模式(Strategy Model)编程 重要 思想 理念

    鸭子类可以根据需要装配不同的行为策略,例如,一个鸭子可以拥有`FlyingBehavior`的实例来实现飞行,而另一个鸭子可以持有`NonFlyingBehavior`实例表示不能飞行。 这种设计遵循了面向对象设计的几个重要原则: 1. ...

    设计模式解读之--策略模式.pdf

    例如,在鸭子的例子中,可以定义 `FlyBehavior` 和 `QuackBehavior` 接口,并让不同类型的鸭子实现这些接口的不同版本。这样,`Duck` 类无需关心具体的飞行或叫声实现,只需要在运行时根据实际情况选择合适的策略...

    设计模式教程-策略模式

    在上述的鸭子游戏示例中,我们看到不同种类的鸭子有不同的行为,如游泳、叫唤和展示。起初,这些行为是通过继承来实现的,但这导致了类的膨胀和紧耦合,尤其是当需要添加新的行为(如飞行)时,原有的结构变得难以...

    java设计模式基础_小鸭子游戏

    在这个游戏中,我们通过模拟各种鸭子的行为来展示面向对象编程中的多态性、继承和接口等核心概念。 首先,让我们从“小鸭子游戏”中的主角——鸭子开始。在Java中,我们可以创建一个`Duck`基类,代表所有鸭子的共同...

    策略模式事例

    这些行为可以被视为策略,因为它们可以根据不同类型的鸭子而变化。例如,我们有以下策略接口和具体策略类: 1. 飞行策略接口(IFlyBehavior):定义了飞行方法,如`fly()`。 - 具体策略类:飞鸭策略(FlyWithWings...

    策略模式 实例代码

    例如,我们可以通过设置不同的飞行和叫声策略来模拟不同的鸭子,如`MallardDuck`、`ModelDuck`等。 在代码中,`Duck`类可能包含如下方法来设置和使用策略: ```java public class Duck { private FlyBehavior ...

    经典android游戏源码打鸭子

    这通常通过一个状态机实现,每个状态对应一组行为,状态之间的切换通过特定的事件触发。 六、性能优化 考虑到手机设备的性能限制,游戏性能优化至关重要。开发者可能使用了对象池来复用游戏对象,减少内存分配;...

    headfirst 策略模式代码

    例如,野生的`MallardDuck`通常会用`FlyWithWings`和`Quack`作为其行为策略,而模型鸭`ModelDuck`在初始化时可能不会飞,也不会叫,但可以通过改变行为策略来模拟不同种类的鸭子行为。 `Check.java`可能是用来测试...

    策略模式案例源码

    在给定的"StimulateDuckPro"源码中,我们可以预见到它可能是一个模拟鸭子行为的例子,用策略模式来实现不同类型的鸭子(如红头鸭、橡皮鸭等)的叫声、游泳等行为。这些行为可以被看作是不同的策略,每个策略类实现了...

    策略模式例子

    - 根据需要,鸭子实例可以通过设置不同的策略对象来改变其行为。例如,一只鸭子可以在某个时刻飞行,在另一个时刻不飞行,只需改变`IFlyBehavior`的实例即可。 策略模式的优点包括: - 代码解耦:策略对象封装了...

    策略模式源码

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。 策略模式定义了一系列的算法,并将每一个算法封装起来,使...

    策略模式的简单例子

    这个例子中,有各种各样的鸭子(例如:红头鸭、橡皮鸭等),每种鸭子的行为(如叫声、游泳、飞)可能会有所不同。这些不同的行为可以通过策略模式来实现。 策略模式主要由三个核心组件构成: 1. 抽象策略(Strategy...

Global site tag (gtag.js) - Google Analytics