美文网首页
设计模式(1) 策略模式

设计模式(1) 策略模式

作者: 风雨雾凇 | 来源:发表于2018-01-14 12:32 被阅读0次

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

    需求: 设计一些可以动态改变的鸭子。

    设计一些行为类

    FlyBehavior.java (飞行动作接口,所有飞行行为必须实现该类)
    package chapter1;
    
    /**
     * Created by fengyuwusong on 2017/7/29.
     */
    
    //所有飞行行为必须实现该接口
    public interface FlyBehavior {
        public void fly();
    }
    
    FlyWithWings(飞行行为类,用翅膀飞)
    package chapter1;
    
    /**
     * Created by fengyuwusong on 2017/7/29.
     */
    public class FlyWithWings implements FlyBehavior {
    
        @Override
        public void fly() {
            System.out.println("我可以用翅膀飞!");
        }
    }
    
    
    QuackBehavior.java(叫行为接口,所有叫声行为都必须实现该类)
    package chapter1;
    
    /**
     * Created by fengyuwusong on 2017/7/29.
     */
    
    //实现叫声的接口
    public interface QuackBehavior {
        public void quack();
    }
    
    
    Quack.java (叫声行为类,呱呱叫)
    package chapter1;
    
    /**
     * Created by fengyuwusong on 2017/7/29.
     */
    public class Quack implements QuackBehavior {
    
        @Override
        public void quack() {
            System.out.println("呱呱叫!");
        }
    }
    
    
    MuteQuack.java(叫声行为类 ,不会叫的)
    package chapter1;
    
    /**
     * Created by fengyuwusong on 2017/7/29.
     */
    public class MuteQuack implements QuackBehavior {
    
        @Override
        public void quack() {
            System.out.println("我不会叫!");
        }
    }
    
    

    设计鸭子抽象类

    Duck.java(鸭子抽象类,所有鸭子的实现都必须基于该类)
    package chapter1;
    
    /**
     * Created by fengyuwusong on 2017/7/29.
     */
    public abstract class Duck {
    
        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;
        }
    
        FlyBehavior flyBehavior;
    
        QuackBehavior quackBehavior;
        
        //必须实现声明类别的方法
        public abstract void display();
    
        //将叫和飞委托给行为类
    
        public void performFly() {
            flyBehavior.fly();
        }
    
        public void performQuack(){
            quackBehavior.quack();
        }
    
        public void swim() {
            System.out.println("所有的鸭子都会游泳!");
        }
    }
    

    设计一些具体鸭子

    ModelDuck.java(模型鸭,不会飞,不会叫)
    package chapter1;
    
    /**
     * Created by fengyuwusong on 2017/7/29.
     */
    public class ModelDuck extends Duck {
        public ModelDuck(){
            //不会飞
            flyBehavior=new FlyNoWay();
            //不会叫
            quackBehavior=new MuteQuack();
        }
    
        @Override
        public void display() {
            System.out.println("我是一只模型鸭,不会飞,不会叫!");
        }
    }
    
    
    TrueDuck.java(真正的鸭子,会飞,会叫)
    package chapter1;
    
    /**
     * Created by fengyuwusong on 2017/7/29.
     */
    public class TrueDuck extends Duck{
    
        public TrueDuck() {
            flyBehavior=new FlyWithWings();
            quackBehavior=new Quack();
        }
    
        @Override
        public void display() {
            System.out.println("我是一只真正的鸭子,,会飞,会叫!");
        }
    }
    
    

    编写测试类

    test.java
    package chapter1;
    
    /**
     * Created by fengyuwusong on 2017/7/29.
     */
    public class test {
        public static void main(String[] args) {
    //        新建一个模型鸭 这里使用 Duck
            Duck model=new ModelDuck();
            model.display();
            model.performFly();
            model.performQuack();
    //        新建一个真正的鸭子
            Duck trueDuck=new TrueDuck();
            trueDuck.display();
            trueDuck.performFly();
            trueDuck.performQuack();
    
            //动态改变模型鸭子的行为,给他装上翅膀
            model.setFlyBehavior(new FlyWithWings());
            model.performFly();
        }
    }
    
    
    运行结果

    我是一只模型鸭,不会飞,不会叫!
    我不会飞!
    我不会叫!
    我是一只真正的鸭子,,会飞,会叫!
    我可以用翅膀飞!
    呱呱叫!
    我可以用翅膀飞!

    文章参考Head First 设计模式

    相关文章

      网友评论

          本文标题:设计模式(1) 策略模式

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