背景介绍:
当前有一个鸭子类(duck)它有红、绿头鸭(实现类),有可以飞(fly)、叫(quack)以及样子(display)的方法
需求:增加并设计一个不会飞的塑料鸭以及使用火箭飞行的太空鸭。
最初两种思路:
1、继承设计思维:在duck中增加fly 方法,会导致不需要飞行的鸭子也会飞行而产生问题。缺点:没有扩展性,不灵活
2、接口或者抽象方法实现设计思维:将fly设计成接口或者抽象方法。其他鸭子实现类实现就好 缺点:如果你写了10种鸭子后,
fly 在复写过程的有的会重复(比如塑料鸭,玩具鸭就会写重复的不会飞逻辑)。会累死。
下面推出策略模式:
/**策略设计模式的原理解释:
duck 类(固定不变有叫与显示的方法)作为基类是变化很少的封装出来
而可变的就以组合的方式(注入接口) 然后通过多态的实现来完成。
这样以后还需要增加不同类型的鸭子以及不同的飞行就不需要改变原有duck的代码以及之前写好的代码
*/
public abstract class Duck { // 鸭子类
//因为每个鸭子的模样是不一样的。如:塑料鸭,灰鸭
public abstract void display();
//面向接口编程,使用组合的方式注入fly 采用开闭原则(原有的系统只做新增不做修改)
private Fly fly;
public Fly getFly() {
return fly;
}
public void setFly(Fly fly) {
this.fly = fly;
}
public void quack() {
System.out.println("呱");
}
}
public class MallardDuck extends Duck { //绿头鸭
public MallardDuck() {
super();
super.setFly(new FlyNoWay());//传入对应对应的飞行实现类 ???直接set 一个实现类?没看懂这写法
}
public void display() {
System.out.println("绿头鸭");
}
}
public class RedHeadDuck extends Duck { //红头鸭
public RedHeadDuck() {
super();
super.setFly(new RocketFly());//注入不同的接口实现类
}
public void display() {
System.out.println("红头鸭");
}
}
public interface Fly { //fly 接口
void fly();
}
/**
* 具体的策略算法实现类
* 具体的飞行实现类
*/
public class FlyNoWay implements Fly {
public void fly() {
System.out.println("不会飞");
}
}
/**
* 具体的策略算法实现类
* 具体的飞行实现类
*/
public class RocketFly implements Fly {
public void fly() {
System.out.println("坐火箭");
}
}
//测试
public static void main(String[] args) {
/***
* 策略模式的理解 根据不同的方式
*/
Duck duck = new MallardDuck();
duck.display();
duck.quack();
duck.getFly();
}