设计模式(1)策略模式

策略模式:分别封装行为接口,实现算法族,超类里放行为接口,子类里放具体的行为对象。原则就是分离变化的部分,封装接口,基于接口编程


优点:算法可以自由切换,避免多重条件判断,扩展性良好

一.实例--鸭子

    1.阶段一(继承)

    (1)设计鸭子父类实现各种行为,然后不同的鸭子去继承它,只要实现各自的display()就可以了,但有新功能,比如飞要添加进来,只需在父类中添加飞的功能,子类就可实现飞了,但是并不是所有的鸭子都会飞,比如橡皮鸭

    (2)出现的问题:对类的局部改动,尤其是超类的局部改动,会影响其它部分,影响会有溢出效应


   2.阶段二(覆盖)

    (1)既然橡皮鸭不能飞,那就在子类中覆盖掉

    (2)产生的问题:超类中挖的坑,却要子类中也改动代码,增加了工作量,不是好的设计


  3.阶段三(策略模式)

    (1)分别封装行为接口,实现算法族,超类里放行为接口,子类里放具体的行为对象。原则就是分离变化的部分,封装接口,基于接口编程


二.代码实现

(1)鸭子类

public abstract class Duck {
    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;

    public void fly(){
        flyBehavior.fly();
    }
    public void quack(){
        quackBehavior.quack();
    }

    public abstract void display();

    //加入get set方法能实现在运行的过程中动态的改变行为

    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;
    }
}

(2)绿头鸭类

public class GreenHeadDuck extends Duck {
    //在初始化构造函数的时候就设置鸭子的行为
    public GreenHeadDuck(){
        flyBehavior = new GoodFlyBehavior();
        quackBehavior = new GaGaQuackBehavior();
    }

    public void display(){
        System.out.println("green head...");
    }
}

(3)飞行接口

//把行为进行抽象
public interface FlyBehavior {
    public void fly();

}

(4)飞行实现

public class GoodFlyBehavior implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("good fly...");
    }
}

猜你喜欢

转载自blog.csdn.net/qq_34645958/article/details/80809824