Java策略模式

本文主要用作学习记录,参考headfirst设计模式

设计原则:找出应用中可能需要变化之外,把它们独立出来,不要和那些不需要变化的代码混在一起

设计原则:针对接口编程,而不是针对实现编程
设计原则:多用组合,少用继承
策略模式定 义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

Java策略模式_第1张图片

Strategy(策略)
作用:提供不同的算法
JDK中的体现:ThreadPoolExecutor中的四种拒绝策略


//定义飞行属性,因为不是所有的鸭子都会飞
public interface FlyBehavior {
    public void fly();
}

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

public class FlyWithWings implements FlyBehavior{

    @Override
    public void fly() {
        System.out.println("I'm flying");
    }
}

//定义叫的属性,因为不是所有的鸭子都会叫
public interface QuackBehavior {
    public void quack();
}

public class Quack implements QuackBehavior{

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

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

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

//抽象类,所有的鸭子都有飞及叫的属性,但是不代表他们会飞或会叫
public abstract class Duck {
    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;

    public Duck(){
    }

    public abstract void display();

    public void performFly(){
        flyBehavior.fly();
    }

    public void performQuack(){
        quackBehavior.quack();
    }

    public void swim(){
        System.out.println("All ducks float,even decoys");
    }

    public FlyBehavior getFlyBehavior() {
        return flyBehavior;
    }

    public void setFlyBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }

    public QuackBehavior getQuackBehavior() {
        return quackBehavior;
    }

    public void setQuackBehavior(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }
}

//继承象类,实例化模型鸭子
public class ModelDuck extends Duck {
    public ModelDuck(){
        flyBehavior = new FlyNoWay();
        quackBehavior = new Quack();
    }
    @Override
    public void display() {
        System.out.println("I'm a model duck");
    }
}


public class TestDuck {
    public static void main(String[] args) {
        Duck duck = new ModelDuck();
        duck.performFly();
        duck.performQuack();
        duck.display();
    }
}



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