设计模式1-策略模式

package DesignPattern;

public class StrategePattern {
    //来自HeadFirst设计模式
    interface FlyBehavior{
        //将飞行行为抽象为接口
        void fly();
    }
    interface QuackBehavior{
        //将鸭子叫抽象为接口
        void quack();
    }
    //下面将不同的飞行和鸭子叫封装为行为
    //飞行行为
    static class FlyWithWings implements FlyBehavior{
        @Override
        public void fly(){
            System.out.println("i fly with wings");
        }
    }
    static class FlyNoWay implements FlyBehavior{
        @Override
        public void fly() {
            System.out.println("i can not fly!");
        }
    }
    //鸭子叫行为
    //呱呱叫
    static class Quack implements QuackBehavior{
        @Override
        public void quack() {
            System.out.println("quack!");
        }
    }
    //吱吱叫
    static class Squeak implements QuackBehavior{
        @Override
        public void quack() {
            System.out.println("squeak!");
        }
    }
    //不会叫
    static class MuteQuack implements QuackBehavior{
        @Override
        public void quack() {
            System.out.println("<silence>");
        }
    }

    //整合行为
    public static class Duck{
        FlyBehavior flyBehavior;
        QuackBehavior quackBehavior;
        public void setFlyBehavior(FlyBehavior flyBehavior){
            this.flyBehavior=flyBehavior;
        }
        public void setQuackBehavior(QuackBehavior quackBehavior){
            this.quackBehavior=quackBehavior;
        }
        public void performQuack(){
            quackBehavior.quack();
        }
        public void performFly(){
            flyBehavior.fly();
        }
    }

    //某个Duck子类
    public static class MallardDuck extends Duck{
        MallardDuck(){
            this.flyBehavior=new FlyWithWings();
            this.quackBehavior= new Quack();
        }
    }

    public static void main(String[] args) {
        Duck model = new MallardDuck();
        model.performFly();
        model.performQuack();
        //通过set方法可以动态改变鸭子行为
        model.setQuackBehavior(new Squeak());
        model.performQuack();
    }
    /*
    通过封装行为,将鸭子和(飞行,叫)两个行为解耦,带来的好处
    1.实现行为接口就可以添加新行为,符合要扩展不要更改的设计原则
    2.可以自由组合(飞,叫)行为,提高了行为代码的可重用性

     */
}

posted @ 2019-04-17 16:21  Fake_coder  阅读(145)  评论(0编辑  收藏  举报