黑马程序员技术交流社区

标题: 【成都校区】设计模式之策略模式笔记 [打印本页]

作者: 逍遥来了    时间: 2018-12-13 13:07
标题: 【成都校区】设计模式之策略模式笔记
设计模式是开发过程中应对一般问题的解决方案,通常是长期编码经验和试错的总结。目前市面上相关书籍提到的公认设计模式大概有23种,在此介绍其中之一:策略模式。
策略模式:定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。很大程度上减少了代码耦合度。
该模式提到的原则有:1、找出应用中可能需要变化之处,把他们独立起来,不要和那些不需要变化的代码混在一起。2、针对接口编程,而不是针实现。3、多用组合、少用继承。
举例说明,摘自《Head First 设计模式》:

定义一个鸭子类:
public abstract class Duck {
    //将飞行和叫的行为接口组合在此
    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;
   
    public Duck() {}

    public abstract void display();
    //所有实现共有的方法
    public void swim() {
        System.out.println("All ducks float, even decoys!");
    }
    //不同种类有不同的飞行方法,但均可由 FlyBehavior表示
    public void performFly() {
        flyBehavior.fly();
    }
    //不同种类有不同的叫方法,但均可由 QuackBehavior表示
    public void performQuack() {
        quackBehavior.quack();
    }

    //提供方法动态改变行为
    public void setFlyBehavior(FlyBehavior fb) {
        this.flyBehavior = fb;
    }

    //提供方法动态改变行为
    public void setQuackBehavior(QuackBehavior qb) {
        this.quackBehavior = qb;
    }
}

分别有一个飞行和叫的行为接口
public interface FlyBehavior {
    void fly();
}
public interface QuackBehavior {
    void quack();
}

让不同的行为实现这些接口
public class FlyWithWings implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("I'm flying!");
    }
}
//以及FlyNoWay、FlyRocketPowered等行为,随意添加
public class Quack implements QuackBehavior {
    @Override
    public void quack() {
        System.out.println("Quack");
    }
}
以及MuteQuack、Squeak等行为,随意添加,此处略

创建所需要的鸭子对象继承鸭子类,但需要改变的行为只是继承了接口引用。
public class MallardDuck extends Duck {

    //通过构造可以赋予指定行为
    MallardDuck() {
        flyBehavior = new FlyWithWings();
        quackBehavior = new Quack();
    }

    @Override
    public void display() {
        System.out.println("I’m a real Mallard duck!");
    }
}

但在运行时也可以改变行为,测试类
public class MiniDuckSimulator{
    public static void main(String[] args) {
        Duck mallard = new MallardDuck();
        mallard.performFly();
        mallard.performQuack();
        
        //动态改变行为
        mallard.setFlyBehavior(new FlyRocketPowered());
        mallard.performFly();
    }
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2