Head First 学习笔记-策略模式

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


设计原则:

1、封装变化

2、多用组合没,少用继承

3、针对接口编程,不针对实现编程


书中例子:“鸭子模拟器”

1、客户:使用封装好的飞信和呱呱叫算法族

public abstract class Duck {
    /**
     * @param args
     */
                                                                                                                                                                          
    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;
    //引用为鸭子封装的两个行为
                                                                                                                                                                          
    public abstract void display();
    //鸭子的模样由子类实现
                                                                                                                                                                          
    public void performFly() {
        flyBehavior.fly();
    }
    public void performQuack() {
        quackBehavior.quack();
    }
    //不同鸭子有不同行为,委托给行为类
                                                                                                                                                                          
    public void swim() {
        System.out.println("所有鸭子都可以游泳。");
    }
}


子类

public class MallardDuck extends Duck {
    public MallardDuck() {
        // TODO Auto-generated constructor stub
        quackBehavior = new Quack();
        //绿头鸭是呱呱叫的
        flyBehavior = new FlyWithWings();
        //绿头鸭会飞
    }
                                                                                          
    @Override
    public void display() {
        // TODO Auto-generated method stub
        System.out.println("我是一只绿头鸭.");
    }
}


2、封装飞行行为

public interface FlyBehavior {
    public void fly();
}
public class FlyWithWings implements FlyBehavior {
    @Override
    public void fly() {
        // TODO Auto-generated method stub
        System.out.println("我正在飞!");
    }
}
public class FlyNoway implements FlyBehavior {
    @Override
    public void fly() {
        // TODO Auto-generated method stub
        System.out.println("我不会飞!");
    }
}


3、封装呱呱叫行为

public interface QuackBehavior {
    public void quack();
}
public class Quack implements QuackBehavior {
    @Override
    public void quack() {
        // TODO Auto-generated method stub
        System.out.println("呱呱");
    }
}
public class MuteQuack implements QuackBehavior {
    @Override
    public void quack() {
        // TODO Auto-generated method stub
        System.out.println("<<不会叫>>");
    }
}


4、测试类

public class MiniDuckSimulator {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Duck mallard = new MallardDuck();
        mallard.display();
        mallard.swim();
        mallard.performFly();
        mallard.performQuack();
    }
}


输出结果:

我是一只绿头鸭.

所有鸭子都可以游泳。

我正在飞!

呱呱


5、动态设定行为

我们还可以在运行时为鸭子“变身”。

在Duck类中加入两个新方法:

public void setFlyBehavior(FlyBehavior fb) {
    flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb) {
    quackBehavior = qb;
}


在运行时使用:

mallard.setFlyBehavior(new FlyNoway());
mallard.performFly();



输出结果:

我是一只绿头鸭.

所有鸭子都可以游泳。

我正在飞!

呱呱

我不会飞!



实战演练:动作冒险游戏,每个角色只能使用一种武器,在游戏过程中可以换武器。

1、客户

public abstract class Character {
    int LV;
    String name;
    String skill;
    WeaponBehavior weapon;
                           
    public abstract void fight();
                           
    public void setWeapon(WeaponBehavior w) {
        this.weapon = w;
    }
                           
    public void display() {
        System.out.println("大家好!我叫" + name);
        System.out.println("我的攻击方式是:");
        weapon.useWeapon();
        System.out.println("我的绝招是" + skill);
    }
}


2、封装武器

public interface WeaponBehavior {
    public void useWeapon();
}
public class Knife implements WeaponBehavior {
    @Override
    public void useWeapon() {
        // TODO Auto-generated method stub
        System.out.println("用匕首刺杀。");
    }
}
public class Sword implements WeaponBehavior {
    @Override
    public void useWeapon() {
        // TODO Auto-generated method stub
        System.out.println("用宝剑斩击。");
    }
}


3、测试

public class AttackSimulator {
              
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Character king = new King();
        Character knight = new Knight();
                  
        king.display();
        System.out.println();
        knight.display();
        System.out.println();
        System.out.println("骑士击杀国王,获得武器匕首!");
        knight.setWeapon(king.weapon);
        knight.display();
    }
}


输出结果:

大家好!我叫国王

我的攻击方式是:

用匕首刺杀。

我的绝招是祈祷


大家好!我叫骑士

我的攻击方式是:

用宝剑斩击。

我的绝招是幻影剑舞


骑士击杀国王,获得武器匕首!

大家好!我叫骑士

我的攻击方式是:

用匕首刺杀。

我的绝招是幻影剑舞


你可能感兴趣的:(设计模式,设计原则)