美文网首页
策略模式

策略模式

作者: yangzai | 来源:发表于2018-01-05 00:19 被阅读5次
    • 意义:分别封装行为接口,实现算法组,超类里放行为接口对象,在子类里具体设定行为对象。原则就是:分离变化部分,封装接口,基于接口编程各种功能。此模式让行为算法的变化独立与算法的使用者。
    • UML:


      image.png
    • 环境(Context)角色:持有一个Strategy的引用。
    • 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个-
      接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
    • 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
    • 设计模型:鸭子
    • 特点: 鸭子有的会飞,有的不会飞。有的会叫,有的不会叫。但都会游泳
      鸭子基类设计:
    public abstract class Duck {
           //定义抽象行为
        FlyBehavior mFlyBehavior;
        QuackBehavior mQuackBehavior;
        public Duck() {}
        public void Fly() {
            mFlyBehavior.fly();
        }
        public void Quack() {
            mQuackBehavior.quack();
        }
        public abstract void display();
        public void SetQuackBehavoir(QuackBehavior qb) {
            mQuackBehavior = qb;
        }
        public void SetFlyBehavoir(FlyBehavior fb) {
            mFlyBehavior = fb;
        }
        public void swim() {
            System.out.println("~~im swim~~");
        }
    }
    

    行为组设计:

    //飞行接口
    public interface FlyBehavior {
        void fly();
    }
    //坏的飞行
    public class    BadFlyBehavior implements FlyBehavior{
        @Override
        public void fly() {
            // TODO Auto-generated method stub
            System.out.println("--BadFly--");
        }
    }
    //好的飞行
    public class    GoodFlyBehavior implements FlyBehavior{
        @Override
        public void fly() {
            // TODO Auto-generated method stub
            System.out.println("--GoodFly--");
        }
    }
    //不会飞
    public class    NoFlyBehavior implements FlyBehavior{
        @Override
        public void fly() {
            // TODO Auto-generated method stub
            System.out.println("--NoFly--");
        }
    }
    

    叫声行为组设计:

    //叫声接口
    public  interface QuackBehavior {
        void quack();
    }
    //嘎嘎叫
    public  class GaGaQuackBehavior implements QuackBehavior{
        @Override
        public void quack() {
            // TODO Auto-generated method stub
            System.out.println("__GaGa__");
        }   
    }
    //咯咯叫
    public  class GeGeQuackBehavior implements QuackBehavior{
        @Override
        public void quack() {
            // TODO Auto-generated method stub
            System.out.println("__GeGe__");
        }
    }
    //不会叫
    public  class NoQuackBehavior implements QuackBehavior{
        @Override
        public void quack() {
            // TODO Auto-generated method stub
            System.out.println("__NoQuack__");
        }
    }
    

    实现了不同行为策略的鸭子

    //绿头鸭会飞,还会嘎嘎叫
    public class GreenHeadDuck extends Duck {
        public GreenHeadDuck() {
            mFlyBehavior = new GoodFlyBehavior();
            mQuackBehavior = new GaGaQuackBehavior();
        }
        @Override
        public void display() {
            // TODO Auto-generated method stub
            System.out.println("**GreenHead**");
        }
    }
    //红头鸭子不会飞,但是会咯咯叫
    public class RedHeadDuck extends Duck {
        public RedHeadDuck() {
            mFlyBehavior = new BadFlyBehavior();
            mQuackBehavior = new GeGeQuackBehavior();
        }
        @Override
        public void display() {
            // TODO Auto-generated method stub
            System.out.println("**RedHead**");
        }
    }
    

    有了这些行为组之后,我们在定义具体的鸭子时,只需要组合不同的具体行为,父类就能帮我们调用具体的行为。这样的好处,子类能充分复用共同的行为代码,并且能够随意组合各种行为,还将变化的行为分离出来,对行为的扩展是开发的。

    相关文章

      网友评论

          本文标题:策略模式

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