设计模式之于程序员,是一种诱惑,不管你信不信,反正我信。不懂则必不会用,学习设计模式,在于在某个时候,需要实现某些功能,你会想到,哦,历经千山万水,原来你也在这里。网上资料云集,看一个例子看不懂,就多看几个,自然知其然且知其所以然。
这里我会记录自己学习策略模式的例子,这个例子来自于Head First设计模式;并分享一个实例,来自于实际应用。
Head First设计模式是从一个鸭子模拟游戏开始讲述策略模式的,游戏中会出现各种鸭子,一边游泳,一边呱呱叫。
- 第一次设计是这样的,设计一个超类Duck,有呱呱叫行为quack,游泳行为swim,这两个行为在超类实现,被所有子类继承;另显示鸭子自己外观的方法display设计为抽象方法,由子类自己实现;这里有两个子类绿头鸭MallarDuck和红头鸭HedHeadDuck,类图如下:
- 第二次的时候,需求有点小变更,需要让鸭子能飞。想都不用想,在超类里面加上一个fly方法就够了不是么!

现在的问题是,一只橡皮鸭,居然也会飞(它不应该会飞)!因为在超类中增加了fly,所以所有的子类都具备了fly行为。既然这样不行,那么可以在橡皮鸭RubberDuck中覆盖超类的fly不久就可以了哇,就像覆盖quack呱呱叫方法一样!如果以后想加入诱饵鸭,它是一只木头假鸭,不会飞不会叫,同样需要覆盖quack和fly方法。
- 那么问题来了,因为鸭子的行为在子类里不断地变化,并且让所有的子类都有这些行为是不恰当的,这就衍生了第一个设计原则:找出应用中可能需要变化之处,把它们独立出来,不和那些不需要变化的部分混合在一起。为了分开变化和不变化的部分,需要准备两组类,让它们完全远离Duck类,一个是fly相关的,一个是quack相关的,每一组类将实现各自的动作。而我们知道Duck类的fly和quack会随着鸭子的不同而变化,所以把它们抽取出来,建立一组新类来代表每个行为。我们希望设计有弹性,因为从一开始,鸭子的行为没有弹性,才让我们走上了这条不归路,我们希望能够指定行为到鸭子的实例,好比我们产生了一个绿头鸭,并指定特定的类型的飞行行为给它,因为这样,我们就可以在运行时动态地改变绿头鸭的飞行行为。所以衍生了第二个设计原则:针对接口编程,不针对实现编程。针对接口编程的真正意思是针对超类型编程。
这里是简单针对接口编程和针对实现编程的例子:
public abstract class Animal {
protected abstract void makeSound();
}
class Dog extends Animal {
@Override
protected void makeSound() {
bark();
}
void bark() {
System.out.println("汪汪叫");
}
}
class Cat extends Animal {
@Override
protected void makeSound() {
meow();
}
void meow() {
System.out.println("喵喵叫");
}
}
这里是测试类:
class MainTest {
public static void main(String[] args) {
// 针对实现编程
Dog dog = new Dog();
dog.bark();
// 针对接口编程
Animal animal = new Cat();
animal.makeSound();
}
}


package src.designpattern.strategy.ex1;
/**
* 鸭子超类
*
* @author wusj
* @date 2015-08-07
*/
public abstract class Duck {
FlyBehaviour flyBehaviour;
QuackBehaviour quackBehaviour;
abstract void display();
/**
* 所有的鸭子都会有用,漂浮起来,包括诱饵鸭
*/
public void swim() {
System.out.println("All ducks float, even decoys.");
}
public void performQuack() {
quackBehaviour.quack();
}
public void performFly() {
flyBehaviour.fly();
}
}
package src.designpattern.strategy.ex1;
/**
* 用翅膀飞
*
* @author wusj
* @date 2015-08-07
*/
public class FlyWithWings implements FlyBehaviour {
public void fly() {
System.out.println("I'm flying.");
}
}
package src.designpattern.strategy.ex1;
/**
* 不会飞
*
* @author wusj
* @date 2015-08-07
*/
public class FlyNoWay implements FlyBehaviour {
public void fly() {
System.out.println("I can't fly.");
}
}
package src.designpattern.strategy.ex1;
/**
* 嘎嘎叫
*
* @author wusj
* @date 2015-08-07
*/
public class Quack implements QuackBehaviour {
public void quack() {
System.out.println("Quack.");
}
}
package src.designpattern.strategy.ex1;
/**
* 不会叫
*
* @author wusj
* @date 2015-08-07
*/
public class MuteQuack implements QuackBehaviour {
public void quack() {
System.out.println("Silence.");
}
}
package src.designpattern.strategy.ex1;
/**
* 绿头鸭
* @author wusj
* @date 2015-08-07
*/
public class MallarDuck extends Duck {
/**
* 绿头鸭会呱呱叫,会飞
*/
public MallarDuck() {
quackBehaviour = new Quack();
flyBehaviour = new FlyWithWings();
}
@Override
void display() {
System.out.println("I'm a real Mallard duck.");
}
}
测试类代码
class MiniDuckSimulator {
public static void main(String[] args) {
Duck mallard = new MallarDuck();
mallard.performFly();
mallard.performQuack();
}
}
// 测试结果
// I'm flying.
// Quack.
其他代码暂略。
策略模式:定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
关于运用实例,请看java设计模式之策略模式应用:订单手续费计算

- 大小: 6.1 KB

- 大小: 8.2 KB

- 大小: 5.3 KB

- 大小: 7.5 KB

- 大小: 12.4 KB

- 大小: 26.1 KB
分享到:
相关推荐
Java 设计模式之策略模式与状态模式 策略模式是 Java 中的一种设计模式,它主要用于解决系统与第三方接口进行数据交互的问题。当系统需要与多种格式的数据进行交互时,使用策略模式可以很好地解决这个问题。例如,...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式主要通过定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法独立于使用它的客户而变化。 首先,策略模式的...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。 #### 核心概念 - **策略接口(Strategy Interface)**:...
Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...
在这个“java设计模式-策略模式”的示例中,我们将深入探讨如何使用策略模式来实现一个简单的超市促销系统。 策略模式的核心思想是定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换。这使得算法的...
**策略模式**是Java设计模式中的行为模式之一,它的核心思想是定义一系列的算法,并将每一个算法封装起来,使它们可以相互替换。这种模式让算法的变化独立于使用算法的客户。在Java编程中,策略模式常用于处理那些...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式通常涉及定义一系列算法,将每个算法封装到具有共同接口的独立类中,使得它们可以相互替换。这样做的主要好处是算法的变化不会影响...
Java设计模式是面向对象编程领域中的重要概念,它是一套被广泛接受并实践的解决软件设计问题的经验总结。设计模式并非具体的代码或库,而是一种在特定情境下为了解决常见问题而制定的通用解决方案的描述。它们描述了...
《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...
在"java设计模式之策略模式"的学习中,我们可以通过一个简单的例子来理解它的应用。例如,在一个软件系统中,我们可能需要对不同的数据进行排序,不同的排序算法(如冒泡排序、快速排序、插入排序等)可以被视为策略...
总的来说,这个“JAVA设计模式例程-策略模式”提供了一个学习和实践策略模式的好例子,通过阅读和分析源代码,我们可以更好地理解如何在实际开发中应用这一模式,提升我们的编程技巧和设计能力。
在这个"JAVA设计模式demo之策略模式"的示例中,你可能会看到以下的代码结构: 1. **策略接口**:`Strategy.java` ```java public interface Strategy { void execute(); } ``` 这个接口定义了一个通用的行为...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式主要通过定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法独立于使用它的客户而变化。 首先,策略模式的...
2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之Observer 9、设计模式之Strategy(策略) 10、设计模式之...
《Java设计模式》是刘伟教授的一本关于设计模式的教材,主要面向高等学校的学生和对Java编程有深入兴趣的开发者。设计模式是软件工程中的一种重要思想,它封装了在特定场景下的问题解决方案,可以提高代码的可读性、...
Java设计模式是软件工程中的一种最佳实践,它提供了一套标准的解决方案,用于解决在编写可维护、可扩展和高效代码时经常遇到的问题。这些模式是经验丰富的开发者们在面对相似问题时,经过反复试验和优化后总结出的...