• 初探设计模式----策略模式


    策略模式:分别封装行为接口,实现算法族,超类里放行为接口对象,在子类里具体设 定行为对象。原则就是:分离变化部分,封装接口,基于接口编程各种功能。此模式让行为 算法的变化独立于算法的使用者。

    我们用一个实例来看下什么策略模式的实现;

    我们拿红头鸭和绿头鸭来举例,首先,他们都用共同的特性,比如它们都会游泳,然后,他们也有不同的特性,比如会飞与不会飞,鸭子的叫声也都不相同,那么我们该如何进行设计呢?

    首先,我们来设置两个接口飞行的接口与叫声的接口:

    1 public interface FlyBehavior {
    2     void fly();
    3 }
    1 public    interface QuackBehavior {
    2     void quack();
    3 };

    在这里,飞行里面有飞行方法,叫声里面有叫声方法,后面我们会实现具体的方法:

    会飞与不会飞:

    1 public class    GoodFlyBehavior implements FlyBehavior
    2 {
    3     @Override
    4     public void fly() {
    5         // TODO Auto-generated method stub
    6         System.out.println("--GoodFly--");
    7     }
    8 }
    1 public class    BadFlyBehavior implements FlyBehavior
    2 {
    3     @Override
    4     public void fly() {
    5         // TODO Auto-generated method stub
    6         System.out.println("--BadFly--");
    7     }
    8 }
    1 public class    NoFlyBehavior implements FlyBehavior
    2 {
    3     @Override
    4     public void fly() {
    5         // TODO Auto-generated method stub
    6         System.out.println("--NoFly--");
    7     }
    8 }

    然后是不同的叫声:

    1 public    class GaGaQuackBehavior implements QuackBehavior
    2 {
    3     @Override
    4     public void quack() {
    5         // TODO Auto-generated method stub
    6         System.out.println("__GaGa__");
    7     }
    8 }
    1 public    class GeGeQuackBehavior implements QuackBehavior
    2 {
    3     @Override
    4     public void quack() {
    5         // TODO Auto-generated method stub
    6         System.out.println("__GeGe__");
    7     }
    8 }
    1 public    class NoQuackBehavior implements QuackBehavior
    2 {
    3     @Override
    4     public void quack() {
    5         // TODO Auto-generated method stub
    6         System.out.println("__NoQuack__");
    7     }
    8 }

    接下来各种行为都有了,我们来设计一个超类,把共同的特性进行提取,所有的鸭子将会继承这个超类:

     1 public abstract class Duck {
     2 
     3     FlyBehavior mFlyBehavior;
     4     QuackBehavior mQuackBehavior;
     5 
     6     public Duck() {}
     7 
     8     public void Fly() {
     9         mFlyBehavior.fly();
    10     }
    11 
    12     public void Quack() {
    13         mQuackBehavior.quack();
    14     }
    15 
    16     public abstract void display();
    17 
    18     public void SetQuackBehavoir(QuackBehavior qb) {
    19         mQuackBehavior = qb;
    20     }
    21 
    22     public void SetFlyBehavoir(FlyBehavior fb) {
    23         mFlyBehavior = fb;
    24     }
    25 
    26     public void swim() {
    27         System.out.println("~~im swim~~");
    28     }
    29 }

    上面的Duck超类我们定义了两个方法分别是飞行方式和叫声,然后我们可以通过set方法对其进行设置,然后共同的游泳我们直接写在了超类里,因为所有鸭子都会游泳

    然后我们该写具体的红头鸭和绿头鸭的类了:

     1 public class GreenHeadDuck extends Duck {
     2 
     3     public GreenHeadDuck() {
     4         mFlyBehavior = new GoodFlyBehavior();
     5         mQuackBehavior = new GaGaQuackBehavior();
     6     }
     7 
     8     @Override
     9     public void display() {
    10         // TODO Auto-generated method stub
    11         System.out.println("**GreenHead**");
    12     }
    13 
    14 }
     1 public class RedHeadDuck extends Duck {
     2 
     3     public RedHeadDuck() {
     4         mFlyBehavior = new BadFlyBehavior();
     5         mQuackBehavior = new GeGeQuackBehavior();
     6     }
     7 
     8     @Override
     9     public void display() {
    10         // TODO Auto-generated method stub
    11         System.out.println("**RedHead**");
    12     }
    13 
    14 }

    绿头鸭飞的很好并且它gaga叫,红头鸭飞得不好并且它gege叫;

    最后,我们来测试一下:

     1 public class StimulateDuck {
     2 
     3     public static void main(String[] args) {
     4 
     5         Duck mGreenHeadDuck = new GreenHeadDuck();
     6         Duck mRedHeadDuck = new RedHeadDuck();
     7 
     8         mGreenHeadDuck.display();
     9         mGreenHeadDuck.Fly();
    10         mGreenHeadDuck.Quack();
    11         mGreenHeadDuck.swim();
    12 
    13         mRedHeadDuck.display();
    14         mRedHeadDuck.Fly();
    15         mRedHeadDuck.Quack();
    16         mRedHeadDuck.swim();
    17         mRedHeadDuck.display();
    18         mRedHeadDuck.SetFlyBehavoir(new NoFlyBehavior());
    19         mRedHeadDuck.Fly();
    20         mRedHeadDuck.SetQuackBehavoir(new NoQuackBehavior());
    21         mRedHeadDuck.Quack();
    22     }
    23 
    24 }

  • 相关阅读:
    MySQL 8.0 复制延迟观测新方式
    同一台交换机不能相互访问?
    这地方怪怪的
    虾米事情都要在5月30日以前完成
    我搬新家了
    痛恨财务的……
    关于Android Studio Arctic Fox版本找不到Database Inspection这件事
    部署SpringBoot项目到腾讯云或其他服务器
    Object.keys方法之详解
    博客园新随笔 添加锚点
  • 原文地址:https://www.cnblogs.com/cuibin/p/7493056.html
Copyright © 2020-2023  润新知