设计模式-----策略模式

本文介绍设计模式中的策略模式,探讨如何通过行为接口实现算法族的封装,以提高代码的灵活性和可维护性。策略模式能够有效地将行为算法的变化独立于算法的使用者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计模式作为前辈们的经验总结,对我们后辈来说是一份珍贵的宝藏。我不是模式的设计者,我只是模式的搬运工。

这篇博文主要是介绍一下策略模式的用法。

        一般我们在开发的过程中,使用的比较多的是继承,如,子类继承父类,子类就拥有父类的成员变量以及行为方法,子类也需实现父类中的抽象方法。

       继承作为java的三大特性之一,其作用也是相当的显著,不过也会带来一些问题:对类的局部改动,会影响其他部分,比如说影响会有溢出效应。所以呢,超类挖的一个坑,每个子类都要来填,增加工作量,时间的复杂度为:O(N^2)。由此我们引出第一个设计模式:策略模式。

       策略模式:分别封装行为接口,实现算法族,超类里面放行为接口对象,在子类里面设定行为对象。原则是:分离变化部分,封装接口,基于接口编程各种功能。此模式让行为算法的变化独立于算法的使用者。

        策略模式注意点:

             1、分享项目中变化部分与不变部分

              2、多用组合少用继承;用行为类组合,而不是行为的继承,从而使得设计更有弹性。

        好了,话不多说,上代码:

接口代码:

package com.yuanqs.strategy;

public interface FlyBehavior {
    void fly();
}
package com.yuanqs.strategy;

public interface QuackBehavior {
    void quack();
}

实现类代码:

package com.yuanqs.strategy;

public class GoodFlyBehavior implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("  I can fly good!!!");
    }
}
package com.yuanqs.strategy;


public class BadFlyBehavior implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println(" I can fly bad");
    }
}
package com.yuanqs.strategy;


public class GagaQuackBehavior implements QuackBehavior {
    @Override
    public void quack() {
        System.out.println("my quack is gaga");
    }
}
package com.yuanqs.strategy;

public class HahaQuackBehavior implements QuackBehavior {
    @Override
    public void quack() {
        System.out.println("my quack is HAHA");
    }
}

抽象类代码:

package com.yuanqs.strategy;

public abstract class Duck {
    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;
    public void fly(){
        flyBehavior.fly();
    }
    public void quack(){
        quackBehavior.quack();
    }
    public abstract void display();

    public void setFlyBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }

    public void setQuackBehavior(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }
}

子类代码:

package com.yuanqs.strategy;


public class GreeHeadDuck extends Duck {
    public GreeHeadDuck() {
        flyBehavior = new GoodFlyBehavior();
        quackBehavior = new HahaQuackBehavior();
    }

    @Override
    public void display() {
        System.out.println("I am green");
    }
}
package com.yuanqs.strategy;

public class RedHeadDuck extends Duck {
    public RedHeadDuck() {
        flyBehavior = new BadFlyBehavior();
        quackBehavior = new GagaQuackBehavior();
    }

    @Override
    public void display() {
        System.out.println("I am red");
    }
}

测试类代码:

package com.yuanqs.strategy;

public class Test {
    public static void main(String[] args) {
        Duck greenHeadDuck = new GreeHeadDuck();
        Duck redHeadDuck = new RedHeadDuck();
        greenHeadDuck.fly();
        greenHeadDuck.quack();
        greenHeadDuck.display();
        redHeadDuck.fly();
        redHeadDuck.quack();
        redHeadDuck.display();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值