设计模式(2)--策略模式 使用场景:一个种对象的不同实例的功能不同

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39424143/article/details/89449830

引入:

  • 模拟鸭子项目:

    • 从面向对象的角度设计这个项目,共同有一个gaga()叫,一个swim()方法,但是有一个display()方法不相同,所以前两个相同就在 父类中实现,剩下一个在父类中是抽象方法在子类中实现。

    • 但是随着使用会添加新的需求,这时候扩展性如何体现,如果放到父类中同时实现具体实现,这时候就直接代码复用就可以提高使用效率,但是有些子类是不会实现那种功能的,所以可以使用在子类中覆盖,但是这个时候因为在父类中实现的功能但是在子类中不需要,如果有很多子类那么代码的重复内容有很多。但是如果不在父类重谢,直接在 子类中写,但是这样做代码的复用性就会降低 。所以说超累挖一个坑,每个子类都要填,增加工作量,复杂度为O(n^2),不是好的设计方式

  • 需要新的设计方式,应对项目的扩展性,降低复杂度:

    • 分析项目的变化与不变化部分,提取变化的部分,抽象成接口+实现
    • 鸭子的哪些功能是会根据新需求变化的?叫声、飞行…
  • 策略模式定义:分别封装行为接口,实现算法族,超类里面放行为接口对象,在子类构造函数里具体设定行为对象

    • 原则就是:
      • 分离变化部分,封装接口,基于接口编程各种功能
      • 此模式让行为算法的变化独立于算法的使用者。

代码实例:

github项目:https://github.com/wangjianxiandev/design
声明一个关于飞的行为接口

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();


    }
}

猜你喜欢

转载自blog.csdn.net/qq_39424143/article/details/89449830
今日推荐