0
点赞
收藏
分享

微信扫一扫

设计模式(2)--策略模式


引入:

  • 模拟鸭子项目:
  • 从面向对象的角度设计这个项目,共同有一个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();


}
}


举报

相关推荐

0 条评论