策略模式
策略模式定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。设计原则1:
找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
设计原则2:
针对接口编程,而不是针对实现编程。
设计原则3:
多用组合,少用继承。
问题解决:
joe上班的公司做了一套相当成功的模拟鸭子游戏:simuduck。游戏中会出现各种鸭子,一边游泳戏水,一边呱呱叫,此系统的内部设计使用了标准的OO技术,设计了一个鸭子超类(Superclass),并让各种鸭子继承此超类。
分析:
由于游戏中会出现各种鸭子,游泳,呱呱叫。所以一开始的思路是:
但是转念一想就会发现这个设计是非常失误的,因为如果公司决定加入新的类型的鸭子,比如说要求这个鸭子要会飞,另一个鸭子要会唱歌,那么怎么办,难道要在Duck类中加入fly();方法,可是这样一来就会使的其他类型的鸭子继承Duck类,也会让他们会飞,会唱歌了。
于是乎我们的第一个设计模式出场啦!!!
下面欢迎策略模式 山药 出场!!!!
下面就是代码实现了!!
两个接口:
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();
}
}