设计模式 - 策略模式

设计模式 - 策略模式,第1张

策略模式 1. 基本原理2. 实现2.1. 实现动作2.2. 组合动作 3. 测试结论

1. 基本原理

策略模式:定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。
以后面的例子说明,下面是类图:

Animal依赖于两个算法接口,而两个接口各自实现了一些具体的算法,这使得Animal和具体的算法解耦;
以下实现了两个类,组合算法:
猫组合了Meow算法和FlyNoWay算法(喵喵叫、不能飞):

狗组合Bark算法和FlyNoWay算法(汪汪叫、不能飞):

2. 实现

针对Animal类,使用策略模式组合两组动作;

2.1. 实现动作

定义两组接口:

public interface FlyBehavior {
    String fly();
}
public interface SoundBehavior {
    String makeSound();
}

实现FlyBehavior:

import impl.FlyBehavior;

public class FlyNoWay implements FlyBehavior {
    public String fly() {
        // 不能飞
        return "noflyable";
    }
}

实现SoundBehavior:

public class Bark implements SoundBehavior {
    public String makeSound() {
        // 汪汪叫
        return "back";
    }
}
public class Meow implements SoundBehavior {
    public String makeSound() {
        // 喵喵叫
        return "meow";
    }
}
2.2. 组合动作

定义Animal接口:

public abstract class Animal {
    String name;
    FlyBehavior flyBehavior;
    SoundBehavior soundBehavior;

    public String getInfo() {
        return name + ": " + flyBehavior.fly() + ", " + soundBehavior.makeSound() + ";";
    }
}

实现两个具体类:

public class Cat extends Animal {
    public Cat(String name) {
        super.name = name;
        super.flyBehavior = new FlyNoWay();
        super.soundBehavior = new Meow();
    }
}
public class Dog extends Animal {
    public Dog(String name) {
        super.name = name;
        super.flyBehavior = new FlyNoWay();
        super.soundBehavior = new Bark();
    }
}
3. 测试

测试Cat类:

public class CatTest {
    @Test
    public void testCat() {
        Animal tom = new Cat("Tom");
        System.out.println(tom.getInfo());
    }
}

测试Dog类:

public class DogTest {
    @Test
    public void testDog() {
        Animal spike = new Dog("Spike");
        System.out.println(spike.getInfo());
    }
}

结果:

Tom: noflyable, meow;
Spike: noflyable, back;
结论

如有新的动物,需要不同的行为(例如鸟,可以飞行和喳喳叫),就可以利用现有的类,或添加新的类,实现FlyBehavior和SuondBehavior,然后将二者进行组合即可,如此可以不用修改已有的代码,即符合开闭原则。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/2990164.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-23
下一篇 2022-09-23

发表评论

登录后才能评论

评论列表(0条)

保存