美文网首页
策略模式

策略模式

作者: y丶M1ng | 来源:发表于2017-11-14 14:46 被阅读0次
策略模式:定义一系列的算法,把每一个算法封装起来,并且使它们可相互替换。
这种设计模式的原理是将所有的策略抽象出来,形成一个接口,利用接口的多态,以及context来进行分离。这样子做的目的是,当你多了一种策略的时候,只需要新增加你的策略类。对整个代码没有进行破坏,也不需要新增其他地方的代码实现了开闭原则,也进行了解耦。以鸭子作为实例。
  1. 首先我们要有个鸭子类,鸭子类作为超类,可以定义为抽象类,Duck类中将飞行封装到两个行为类中,在以后可以轻易地改动或扩充行为而不影响其他部分,系统更有弹性。这种方式体现了2个特点
    (1). 使用组合不使用继承,将鸭子的飞通过组合的形式,让系统具有弹性
    (2).面向接口编程,实现了解耦。

Duck类

public abstract class Duck {
    FlyBehavior flyBehavior;
    
    public Duck() {
    }

    // 动态设置飞行行为
    public void setFlyBehavior(FlyBehavior fb) {
        flyBehavior = fb;
    }
    abstract void display();
    // 将飞行行为委托给飞行行为类处理
    public void performFly() {
        flyBehavior.fly();
    }
}

  1. 实现飞的接口和叫的接口。这个时候是具体类了,可能飞行声有多种,我们可以实现几种。

FlyWithWings用翅膀飞类

public class FlyWithWings implements FlyBehavior{
    public void fly() {
        System.out.println("I'm flying!!");
    }

}

FlyNoWay不会飞类

public class FlyNoWay implements FlyBehavior {  
    public void fly() {  
        System.out.println("I can't fly");  
    }  
} 

3.实现了飞行的具体实现类之后,要去实现具体鸭子的具体类,继承鸭子这个抽象类。在这个具体类中可以在构造函数中初始化飞行行为。

红头鸭子类

public class RedHeadDuck extends Duck {
    @Override
    void display() {
         System.out.println("I'm a real Red Headed duck");  
    }
          //构造函数中默认实现的飞行属性为翅膀飞行
      public RedHeadDuck() {  
            flyBehavior = new FlyWithWings();  
        }  
}

4.在测试类中实例化这个红头鸭类,发现实例化之后,他就具有了飞行的行为。也可以通过setFlyBehavior()方法修改红头鸭的飞行行为。

测试类

public class Demo {
    public static void main(String[] args) {
        //实例化一只红头鸭
        RedHeadDuck redHeadDuck = new RedHeadDuck();
        //输出鸭子的类型
        redHeadDuck.display();
        //输出红头鸭的飞行属性
        redHeadDuck.performFly();
        //修改他的飞行属性
        redHeadDuck.setFlyBehavior(new FlyNoWay());
        //输出鸭子的类型
        redHeadDuck.display();
        //输出红头鸭的飞行属性
        redHeadDuck.performFly();
    }
}

显示结果

运行结果.png

相关文章

网友评论

      本文标题:策略模式

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