引入:
- 模拟鸭子项目:
- 从面向对象的角度设计这个项目,共同有一个gaga()叫,一个swim()方法,但是有一个display()方法不相同,所以前两个相同就在 父类中实现,剩下一个在父类中是抽象方法在子类中实现。
- 但是随着使用会添加新的需求,这时候扩展性如何体现,如果放到父类中同时实现具体实现,这时候就直接代码复用就可以提高使用效率,但是有些子类是不会实现那种功能的,所以可以使用在子类中覆盖,但是这个时候因为在父类中实现的功能但是在子类中不需要,如果有很多子类那么代码的重复内容有很多。但是如果不在父类重谢,直接在 子类中写,但是这样做代码的复用性就会降低 。所以说超累挖一个坑,每个子类都要填,增加工作量,复杂度为O(n^2),不是好的设计方式
- 需要新的设计方式,应对项目的扩展性,降低复杂度:
- 分析项目的变化与不变化部分,提取变化的部分,抽象成接口+实现
- 鸭子的哪些功能是会根据新需求变化的?叫声、飞行…
- 策略模式定义:分别封装行为接口,实现算法族,超类里面放行为接口对象,在子类构造函数里具体设定行为对象
- 原则就是:
- 分离变化部分,封装接口,基于接口编程各种功能
- 此模式让行为算法的变化独立于算法的使用者。
代码实例:
声明一个关于飞的行为接口
package celuemoshi.Impl;
/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-17
* Time: 20:10
*/
public interface FlyBehavior {
void fly();
}
实现不同类型的飞比如会不会飞
package celuemoshi.ImplAble;
import celuemoshi.Impl.FlyBehavior;
/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-17
* Time: 20:12
*/
public class GoodFly implements FlyBehavior {
@Override
public void fly() {
System.out.println("会飞");
}
}
实现抽象类Duck
package celuemoshi;
import celuemoshi.Impl.FlyBehavior;
import celuemoshi.Impl.Swimbehavior;
/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-17
* Time: 20:14
*/
public abstract class Duck {
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setSwimbehavior(Swimbehavior swimbehavior) {
this.swimbehavior = swimbehavior;
}
FlyBehavior flyBehavior;
Swimbehavior swimbehavior;
public Duck(){
}
public void Fly(){
flyBehavior.fly();
}
public void Swim(){
swimbehavior.swim();
}
public abstract void display();
}
实现某一个子类红鸭
package celuemoshi;
import celuemoshi.Impl.FlyBehavior;
import celuemoshi.Impl.Swimbehavior;
import celuemoshi.ImplAble.GoodFly;
import celuemoshi.ImplAble.GoodSwim;
/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-17
* Time: 20:16
*/
public class RedDuck extends Duck {
FlyBehavior flyBehavior;
Swimbehavior swimbehavior;
public RedDuck(){
flyBehavior = new GoodFly();
swimbehavior = new GoodSwim();
setSwimbehavior(swimbehavior);
setFlyBehavior(flyBehavior);
}
@Override
public void display() {
System.out.println("我是红头鸭");
}
}
主函数:
package celuemoshi;
/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-17
* Time: 20:17
*/
public class DuckTest {
public static void main(String[] args) {
Duck redduck = new RedDuck();
redduck.display();
redduck.Fly();
redduck.Swim();
}
}