`

Head First 之 策略模式

阅读更多
设计原则:
1、找出应用中可能需要变化之处,把它独立出来,不要和那些不需变化的代码混在一起。
2、针对接口编程,而不是针对实现编程。(针对超类型编程)。
3、多用组合,少用继承。


示例程序(此处代码都为书上原码,只不过是本人手输入了一次)
大概讲下:

有套莫伊鸭子的游戏,SimUDuck,游戏中会出现许多鸭子,一边游泳,一边呱呱叫。
一开始,使用了标准的OO技术,设计了一个鸭子超类,并让各种鸭子继承此超类。

在此时,这种设计是对的,但是,如果老板说需要给鸭子增加个飞行的动作,那么此时该如何做呢?

我当时的做法和书中joe做法一样,把飞行动作放入父类,但这样,成了所有的鸭子都会飞,但明显不是所有鸭子都会飞,那么,又改为把飞行动作独立为一个接口,会飞的鸭子实现此接口,但这样同样很麻烦,每只会飞的鸭子都得实现飞行的方法。而且,飞行还有横飞,侧飞,倒飞,显而易见,(鸭子叫同样适合这种理论)这两种设计方法都不适合这里。

下面的代码:

package com.test;

鸭子超类:
public class Duck {
        //此处为组合(把鸭子叫的接口作为类的一个属性)
	private QuackBehavior quackBehavior;
	
	public QuackBehavior getQuackBehavior() {
		return quackBehavior;
	}

	public void setQuackBehavior(QuackBehavior quackBehavior) {
		this.quackBehavior = quackBehavior;
	}

	public Duck(){
		quackBehavior = new Quack();
	}
	
	public void performQuack(){
		quackBehavior.quack();
	}
	
	public static void main(String[] args) {
		Duck duck = new Duck();
		//动态设定鸭子叫的方式(可能嘎嘎,可能叽叽,也可能不会叫)
		duck.setQuackBehavior(new Squeak());
		duck.performQuack();
	}
}


package com.test;

/**
 * 飞行类的接口
 * @author mah
 *
 */
public interface FlyBehavior {
	public void fly();
}


package com.test;

/**
 * 鸭叫接口
 * @author mah
 *
 */
public interface QuackBehavior {
	public void quack();
}


package com.test;

public class FlyNoWay implements FlyBehavior{

	@Override
	public void fly() {
		System.out.println("不会飞");
	}
}


package com.test;

public class FlyWithWings implements FlyBehavior{

	@Override
	public void fly() {
		System.out.println("我飞~~~~");
	}

}


package com.test;
//木头鸭子叫声
public class MuteQuack implements QuackBehavior{

	@Override
	public void quack() {
		System.out.println("不会叫");
	}
}


package com.test;
//鸭子叫声
public class Quack implements QuackBehavior{

	@Override
	public void quack() {
		System.out.println("嘎嘎");
	}
}


package com.test;
//皮鸭子叫声
public class Squeak implements QuackBehavior{

	@Override
	public void quack() {
		System.out.println("叽叽");
	}

}


策略模式抽取算法,并分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户

OK,下一章,观察者模式
分享到:
评论

相关推荐

    Head First 之策略模式源码

    《Head First 之策略模式源码》是一份深入解析策略模式的编程学习资源,它以Head First系列的易懂风格,结合源代码实例,帮助读者理解并掌握这一设计模式。策略模式是软件工程中的一种行为设计模式,它使你能在运行...

    HeadFirst策略模式

    《HeadFirst策略模式》是设计模式领域的一本经典著作,其第一章主要介绍了策略模式的基本概念、原理以及在C++中的具体实现。策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。这种模式允许我们用不同的...

    head first 设计模式 策略模式 C++ 代码

    在《Head First 设计模式》这本书中,策略模式被详细地讲解,并通过C++代码实现来加深理解。策略模式的核心思想是定义一系列的算法,并将每一个算法封装起来,使它们可以相互替换。这使得算法的变化独立于使用算法的...

    Head first C++策略设计模式

    综上所述,这个压缩包提供的“Head First C++策略设计模式”示例,不仅教你如何在C++中实现策略模式,还通过类图帮助你理解面向对象设计中的一个重要概念。通过学习这个案例,你可以更好地掌握如何在实际项目中运用...

    Head First设计模式(完整高清版).pdf

    - 策略模式:定义一系列算法,并将每个算法封装起来,使它们可以互相替换。 - 模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。 - 访问者模式:表示一个作用于某对象结构中的各元素的操作,...

    Headfirst设计模式中文高清PDF+附书源码

    1. **工厂模式**:这是最基础的设计模式之一,用于创建对象,它提供了一种将对象创建过程抽象化的方法,使得代码更易于扩展。在Java中,我们可以使用工厂类或者抽象工厂模式来实现。 2. **单例模式**:确保一个类...

    headfirst 策略模式代码

    《深入理解Headfirst策略模式——基于Java代码实例》 策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Headfirst的讲解中,这个模式被巧妙地通过鸭子的例子来阐述,使得复杂的概念变得生动易懂。在...

    [行为模式] head first 设计模式之策略模式(strategy)

    在《Head First 设计模式》这本书中,策略模式被用来演示如何在不修改原有代码的情况下,通过改变执行策略来改变对象的行为。例如,我们可以创建一个`SortStrategy`接口,包含`sort()`方法,然后定义不同的排序策略...

    Head first 设计模式 第一章 策略模式 pdf + 源代码

    在《Head First设计模式》的第一章中,作者可能通过生动的示例和易于理解的图表,解释了如何在实际问题中识别策略模式的应用场景,以及如何有效地实现和使用这个模式。书中可能涵盖了以下内容: - 策略模式的基本...

    [中文]Head-First设计模式.pdf

    1. 工厂模式:这是最基础的设计模式之一,用于创建对象,它提供了一种封装对象创建过程的方法,使得具体创建哪个对象的决定可以在运行时做出。在Java中,抽象工厂模式可以用来创建一系列相关的对象。 2. 单例模式:...

    HeadFirst 设计模式学习笔记1--策略模式Demo

    《HeadFirst设计模式学习笔记1--策略模式Demo》 在软件工程中,设计模式是一种解决常见问题的标准方案,它提供了一种在特定情况下组织代码的模板。策略模式是设计模式中的一种行为模式,它允许在运行时选择算法或...

    Head First 之之观察者模式

    《Head First 之观察者模式》是一本深入浅出介绍观察者模式的书籍,通过生动有趣的方式帮助读者理解和掌握这一设计模式。观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生...

    head first策略者模式

    《Head First 策略者模式》学习笔记 策略者模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们常常遇到需要根据不同的情况执行不同算法的问题。策略者模式就是为了解决这类问题而生,它...

    《Head.First设计模式》书中源代码(Java语言)

    6. **策略模式**:定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法的变化独立于使用算法的客户。`Context.java`和`Strategy.java`等文件将展示策略接口和各种策略实现类。 7. **模板方法...

    Head First Design Patterns 英文版 Head First设计模式

    《Head First Design Patterns》是一本深入浅出介绍设计模式的图书,由Eric Freeman、Elisabeth Freeman、Bert Bates和Kathy Sierra联合编写。本书结合认知科学原理和神经生物学研究,采用引导式教学方法,通过故事...

    Head First设计模式和HeadFirst in java 源码以及23种设计模式关系图

    行为型模式涉及对象间的交互和责任分配,包括模板方法模式(Template Method)、观察者模式(Observer)、策略模式(Strategy)、职责链模式(Chain of Responsibility)、命令模式(Command)、迭代器模式...

    HeadFirst设计模式PPT

    《HeadFirst设计模式》是一本深受开发者欢迎的书籍,它以独特、易理解的方式介绍了软件设计中的重要概念——设计模式。设计模式是经验丰富的开发者在解决常见问题时总结出的最佳实践,它们为软件设计提供了可复用的...

    head first java 设计模式源代码

    9. **策略模式**:定义一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户。 10. **模板方法模式**:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。使得...

    《HeadFirst设计模式》策略模式c++实现

    策略模式: 定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 The Strategy Pattern defines a family of algorithms, encapsulates each one, and makes ...

Global site tag (gtag.js) - Google Analytics