美文网首页
策略模式

策略模式

作者: 隔壁丨王大爷 | 来源:发表于2018-06-07 10:32 被阅读7次

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

    类图:

    image.png
    事例:模拟鸭子应用
    鸭子的外表,游泳,叫声,飞行等行为。
    并不是所有的鸭子都会飞行,并不是所有鸭子的叫声都一样,所以把鸭子的叫声和飞行行为都抽象出来。
    飞行行为的接口
    public interface FlyBehavior {
    
        void fly();
    }
    
    

    鸣叫行为的接口

    public interface QuackBehavior {
        void quack();
    }
    
    

    实现接口,列举可能的行为。
    飞行行为的实现

    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 class MuteQuack implements QuackBehavior {
    
        @Override
        public void quack(){
            System.out.println("<< slience >>");
        }
    }
    ```public class Quack implements QuackBehavior {
        @Override
        public void quack() {
            System.out.println("Quack");
        }
    }
    
    public class Squeak implements QuackBehavior {
    
        @Override
        public void quack(){
            System.out.println("Squeak");
        }
    
    }
    

    鸭子的抽象类:

    public abstract class Duck {
    
        private FlyBehavior flyBehavior;
        private QuackBehavior quackBehavior;
    
        public void setFlyBehavior(FlyBehavior flyBehavior){
            this.flyBehavior = flyBehavior;
        }
    
        public void setQuackBehavior(QuackBehavior quackBehavior){
            this.quackBehavior = quackBehavior;
        }
    
    
        public abstract void dispaly();
    
        public void performFly(){
            this.flyBehavior.fly();
        }
    
        public void performQuack(){
            this.quackBehavior.quack();
        }
    
        public void swim(){
            System.out.println("All ducks can swim");
        }
    }
    
    

    通过set方法可以动态改变鸭子的行为
    鸭子的具体实现类

    public class MallardDuck extends Duck {
    
        MallardDuck(){
            setFlyBehavior(new FlyWithWings());
            setQuackBehavior(new Quack());
        }
        @Override
        public void dispaly() {
            System.out.println("I'm a mallard duck");
        }
    }
    
    

    测试类

    public class Test {
    
        public static void main(String[] args){
            MallardDuck mallardDuck = new MallardDuck();
            mallardDuck.performFly();
            mallardDuck.performQuack();
            mallardDuck.swim();
            mallardDuck.dispaly();
            mallardDuck.setFlyBehavior(new FlyNoWay());
            mallardDuck.performFly();
        }
    }
    
    

    可以将每组行为看成一个算法族。

    相关文章

      网友评论

          本文标题:策略模式

          本文链接:https://www.haomeiwen.com/subject/dtpwsftx.html