Head First 设计模式:1策略模式

时间:2021-08-31 21:58:10

策略模式

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

设计原则1

找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

设计原则2:

针对接口编程,而不是针对实现编程。

设计原则3:

多用组合,少用继承。


问题解决:

joe上班的公司做了一套相当成功的模拟鸭子游戏:simuduck。游戏中会出现各种鸭子,一边游泳戏水,一边呱呱叫,此系统的内部设计使用了标准的OO技术,设计了一个鸭子超类(Superclass),并让各种鸭子继承此超类。


分析:

由于游戏中会出现各种鸭子,游泳,呱呱叫。所以一开始的思路是:


Head First 设计模式:1策略模式

但是转念一想就会发现这个设计是非常失误的,因为如果公司决定加入新的类型的鸭子,比如说要求这个鸭子要会飞,另一个鸭子要会唱歌,那么怎么办,难道要在Duck类中加入fly();方法,可是这样一来就会使的其他类型的鸭子继承Duck类,也会让他们会飞,会唱歌了。


于是乎我们的第一个设计模式出场啦!!!

下面欢迎策略模式 山药 出场!!!!


Head First 设计模式:1策略模式


下面就是代码实现了!!


两个接口:

public interface FlyBehavior {
public void fly();
}

public interface QuackBehavior {
public void quack();
}

几个类实现这两个接口:

1,实现Quack

public class Quack implements QuackBehavior {
@Override
public void quack() {
System.out.println("Quack!");
}
}

public class Squeak implements QuackBehavior {
@Override
public void quack() {
System.out.println("Squeak!");
}
}

2,实现Fly

public class FlyNoWay implements FlyBehavior{
@Override
public void fly() {
System.out.println("i can`t fly!");
}
}

public class FlyWithSwing implements FlyBehavior {
@Override
public void fly() {
System.out.println("I`m flying!!");
}
}

public class FlyRocketPowered implements FlyBehavior {
@Override
public void fly() {
System.out.println("I am flying with a rocket!");
}
}

Duck超类:

public abstract class Duck {
FlyBehavior flyBehavior;  //两个接口
QuackBehavior quackBehavior;
public Duck(){
}
public abstract void display();

//这里用abstrack让其他继承的类可以实现不同方法
public void performFly(){
flyBehavior.fly();
}
public void performQuack(){
quackBehavior.quack();
}
public void swim(){
System.out.println("All ducks float,even decoys!");
}

//使用set方法,可以实现动态的改变
public void setFlyBehavior(FlyBehavior fly){
flyBehavior = fly;
}
public void setQuackBehavior(QuackBehavior qu){
quackBehavior = qu;
}
}

实现类:

1,

public class MallardDuck extends Duck{
public MallardDuck(){//构造方法,直接实现不同的飞行和叫的方式
quackBehavior = new Quack();
flyBehavior = new FlyWithSwing();
}
@Override
public void display() {
System.out.println("I am a real Mallard duck!");
}
}

2,

public class ModeDuck extends Duck{
public ModeDuck(){
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}
@Override
public void display() {
System.out.println("I am a Mode Duck!");
}
}

测试:

public class MiniDuckSimulator {
public static void main(String[] args) {
Duck mallard = new MallardDuck();
mallard.display();
mallard.performFly();
mallard.performQuack();
System.out.println("*******************");

Duck mode = new ModeDuck();
mode.display();
mode.performFly();

//这里就动态的改变了其飞行方法
mode.setFlyBehavior(new FlyRocketPowered());
mode.performFly();
}
}