上节我们谈到做一个鸭子的游戏,把共有的方法(游泳)作为父类,有变化的行为(飞,叫)作为接口,进而实现,满足各类鸭子去使用,那那我们该如何将它组合起来呢?
首先,在Duck 里面加入 FlyBehaviour 和 QuackBehaviour的实例变量,为接口类型,再添加可以执行的方法
performFly 和performQuack.
public class Duck { public FlyBehaviour flyBehaviour; public QuackBehaviour quackBehaviour; public void performFly(){ flyBehaviour.fly(); } public void performQuack(){ quackBehaviour.quack(); } public void swin(){ // 游泳 } }
下面我们看绿头鸭的类:
public class MallarDuck extends Duck{ public MallarDuck(){ // 这里用呱呱叫,可以飞 // 当perform 被调用时候,行为就委托给接口,我只需要得到叫或者飞的结果就行了 super.quackBehaviour = new QuackOne(); super.flyBehaviour = new FlyWithWing(); } public void display(){ // 绿头鸭 } }
这里我们发现,构造里面使用了new + 实现类,并且这里限定了绿头鸭叫的方式和飞的方式,也不灵活,
在原则中有一个是:针对接口编程(针对超类编程)
为了更加灵活,让我们的鸭子有更多的 叫的模式 和飞行模式。这样设计:
public class Duck { public FlyBehaviour flyBehaviour; public QuackBehaviour quackBehaviour; // 加入两个 设值方法,方便动态的改变行为方式 public void setFlyBehaviour(FlyBehaviour flyBehaviour) { this.flyBehaviour = flyBehaviour; } public void setQuackBehaviour(QuackBehaviour quackBehaviour) { this.quackBehaviour = quackBehaviour; } public void performFly(){ flyBehaviour.fly(); } public void performQuack(){ quackBehaviour.quack(); } public void swin(){ // 游泳 } }
上面类暂时不变,后面其他模式 代替这种写法。
现在假设 我们添加了一种新的飞行,NewFly.要求绿头鸭在特定情况下,可以使用新的模式
public class NewFly implements FlyBehaviour{ @Override public void fly() { // 这是一种新的飞行模式 System.out.println("fly 2"); } }
让我们进行测试:
public class Test { public static void main(String[] args) { Duck f1 = new MallarDuck(); f1.performFly(); // 换飞行模式 f1.setFlyBehaviour(new NewFly()); f1.performFly(); } }
现在已经可以随意的进行变化的,至于构造器那里,可以想想如何去完善。
小结 :我们这里分享思路:
1.将公共部分,放在超类里面使用
2.有变化的行为提炼成接口,提供实现类,提高代码的灵活性和复用性
3.所有的行为不用自己去实现,交给执行为的方法,我们只负责调用
4.为了让某种行为可以出现多种变化,或者多种方式,以属性注入接口,可以动态控制
策略模式:定义了算法(行为),分别封装起来,让你过他们之间可以相互转换,此模式让算法的变化独立于使用算法的客户。(摘自设计模式)
相关推荐
标题"设计模式策略模式demo"指的是我们将通过一个实际的示例来演示如何在代码中应用策略模式。这个示例可能是基于Java或C#等语言的一个小项目,用于帮助开发者更好地理解和掌握策略模式的运用。 描述中的"参考...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或场景来执行不同算法的情况。策略模式就是为了解决这类问题而提出的,它将每一种算法封装到具有共同...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式主要通过定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法独立于使用它的客户而变化。 首先,策略模式的...
iOS 设计模式 策略模式
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件工程中,当一个系统需要在不同时间执行不同的算法或者行为时,策略模式就显得尤为有用。这种模式将算法封装到独立的可相互替换的策略类中,使得...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在《Head First 设计模式》这本书中,策略模式被详细地讲解,并通过C++代码实现来加深理解。策略模式的核心思想是定义一系列的算法,并将每一个算法...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式通常涉及定义一系列算法,将每个算法封装到具有共同接口的独立类中,使得它们可以相互替换。这样做的主要好处是算法的变化不会影响...
设计模式中的策略模式。根据《设计模式》一书编写
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式通常用于替换硬编码的条件语句,使代码更加灵活、可扩展和易于维护。下面我们将详细探讨策略模式的核心概念、实现方式以及在实际...
c++设计模式-行为型模式-策略模式;qt工程;c++简单源码; 策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于...
短小版的thinkphp3.2 缓存类 策略模式理解 希望可以帮助到你
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,通过将算法封装为独立的类并让它们遵循一个公共接口,我们可以根据需要动态地切换不同的算法,而不影响使用这些算法的客户代码。以下是策略...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件设计中,有时我们需要根据不同的场景或条件选择不同的算法或行为。策略模式允许我们将这些算法封装成独立的类,每个类代表一种策略,然后在运行...
1. **策略模式**:策略模式允许在运行时动态选择算法或策略。它将算法封装到独立的类中,使得算法之间的替换变得容易。在报告中,可能会展示如何通过接口定义策略接口,以及如何创建不同的实现策略的类,以便根据...
设计模式之策略模式 鸭子问题 策略模式是一种经典的设计模式,通过鸭子问题,可以让学习者更好地了解设计模式的概念和实现。策略模式的主要思想是定义一系列的算法,并将每一个算法封装起来,使它们可以相互替换。...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或时间点执行不同算法的情况。策略模式提供了一种将算法族封装到各自独立的类中,并在运行时选择合适的...
将校验和计算方式设计成接口,可以根据实际需求写接口实现类,然后再将数据和类实例传入计算得到期望的校验和值。
在本篇中,我们将深入探讨“策略模式”,这是一种行为设计模式,它使算法族能够互换,使得代码能根据环境或策略的不同选择不同的行为。 策略模式的核心思想是将算法封装在独立的类中,使得它们可以互相替换。这种...
Java 设计模式之策略模式与状态模式 策略模式是 Java 中的一种设计模式,它主要用于解决系统与第三方接口进行数据交互的问题。当系统需要与多种格式的数据进行交互时,使用策略模式可以很好地解决这个问题。例如,...