1. 策略模式

2018-03-25  本文已影响0人  luhuancheng

设计原则

定义和实现思路

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

UML模型

策略模式.jpg

具体代码

/**
 * 接口封装行为
 *
 * @author luhuancheng
 * @since 2018/3/25 21:56
 */
public interface FlyBehavior {

    void fly();

}
/**
 * 实现行为接口,封装具体行为
 *
 * @author luhuancheng
 * @since 2018/3/25 21:57
 */
public class FlyWithWings implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("I'm flying!");
    }
}


/**
 * 接口封装行为
 *
 * @author luhuancheng
 * @since 2018/3/25 21:55
 */
public interface QuackBehavior {

    void quack();

}
/**
 * 实现行为接口,封装具体行为
 *
 * @author luhuancheng
 * @since 2018/3/25 21:58
 */
public class Quack implements QuackBehavior {
    @Override
    public void quack() {
        System.out.println("Quack!");
    }
}

/**
*
*抽象超类,用实例变量组合两个接口的实现类实例
*/
public abstract class Duck {

    QuackBehavior quackBehavior;

    FlyBehavior flyBehavior;

    /**
     * 委托给具体的行为类
     */
    public void performQuack() {
        quackBehavior.quack();
    }

    /**
     * 委托给具体的行为类
     */
    public void performFly() {
        flyBehavior.fly();
    }

    public abstract void display();

    public void swim() {
        System.out.println("Duck swim");
    }

    /**
     * 运行时动态改变具体行为
     * @param quackBehavior
     */
    public void setQuackBehavior(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }

    /**
     * 运行时动态改变具体行为
     * @param flyBehavior
     */
        public void setFlyBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }
}
/**
 * 将不变的代码封装在超类(Duck)中,把变化的代码用接口抽象,并且使用组合的方式把接口的具体方式引入。
 * 通过委托的方式执行具体的行为
 *
 * @author luhuancheng
 * @since 2018/3/25 22:11
 */
public class MallardDuck extends Duck {

    public MallardDuck() {
        quackBehavior = new Quack();
        flyBehavior = new FlyWithWings();
    }

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

/**
 * 客户端类
 *
 * @author luhuancheng
 * @since 2018/3/25 22:16
 */
public class Client {

    public static void main(String[] args) {
        Duck mallard = new MallardDuck();
        mallard.performFly();
        mallard.performQuack();
    }

}

调用时序图

策略模式时序图.png

总结

上一篇 下一篇

猜你喜欢

热点阅读