java设计模式-24策略模式

定义:

  • 定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
  • 这算法体现了几个设计原则

第一、把变化的代码从不变的代码中分离出来;
第二、针对接口编程而不是具体类(定义了策略接口);
第三、多用组合/聚合,少用继承(客户通过组合方式使用策略)。

  • 多用组合/聚合 少用继承;用行为类组合,而不是行为的继承。更有弹性
  • 体现了“对修改关闭,对扩展开放”原则,客户端增加行为不用修改原有代码,只要添加一种策略(或者行为)即可,避免了使用多重转移语句(if…else if…else)
  • 需要注意的是:每添加一个策略就要增加一个类,当策略过多是会导致类数目庞大

三个角色:

  • 抽象策略(Strategy):通常由接口或抽象类实现。定义了多个具体策略的公共接口,具体策略类中各种不同的算法以不同的方式实现这个接口;Context使用这些接口调用不同实现的算法。
  • 具体策略(ConcreteStrategy):实现Strategy接口或继承于抽象类Strategy,封装了具体的算法和行为。
  • 环境类(Contex):持有一个公共策略接口的引用,直接给客户端调用。

代码

public class test19 {
    public static void main(String[] args) {
        //野鸭
        System.out.println("野鸭的实际飞翔能力");
        WildDuck wildDuck = new WildDuck();
        wildDuck.fly();
        //玩具鸭
        System.out.println("玩具鸭的实际飞翔能力");
        ToyDuck toyDuck = new ToyDuck();
        toyDuck.fly();
        System.out.println("北京鸭的实际飞翔能力");
        //北京鸭
        PekingDuck pekingDuck = new PekingDuck();
        pekingDuck.fly();
       /* 野鸭的实际飞翔能力
        飞翔技术高超~~~~
        玩具鸭的实际飞翔能力
        不会飞翔~~~~
        北京鸭的实际飞翔能力
        飞翔技术一般~~~~*/
        

    }
}

interface FlyBehavior{
    void fly();//子类具体实现
}

class GoodFlyBehavior implements FlyBehavior{
    @Override
    public void fly() {
        System.out.println("飞翔技术高超~~~~");
    }
}
class BadFlyBehavior implements FlyBehavior{
    @Override
    public void fly() {
        System.out.println("飞翔技术一般~~~~");
    }
}
class NoFlyBehavior implements FlyBehavior{
    @Override
    public void fly() {
        System.out.println(" 不会飞翔~~~~");
    }
}
interface QuackBehavior{
    void quack();//子类实现
}

abstract  class Duck{
    //属性, 策略接口
    FlyBehavior flyBehavior;
    //其它属性<->策略接口
    QuackBehavior quackBehavior;

    public Duck() {
    }
    //显示鸭子信息
    abstract void display();

    void quack(){
        System.out.println("鸭子嘎嘎叫~~");
    }
    void swim(){
        System.out.println("鸭子会游泳~~");
    }
    public void fly() {

        //改进
        if(flyBehavior != null) {
            flyBehavior.fly();
        }
    }

    public FlyBehavior getFlyBehavior() {
        return flyBehavior;
    }

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

    public QuackBehavior getQuackBehavior() {
        return quackBehavior;
    }

    public void setQuackBehavior(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }
}
class PekingDuck extends Duck {
    //假如北京鸭可以飞翔,但是飞翔技术一般
    public PekingDuck() {
        flyBehavior = new BadFlyBehavior();

    }

    @Override
    public void display() {
        System.out.println("~~北京鸭~~~");
    }
}
//玩具鸭
 class ToyDuck extends Duck{
    public ToyDuck() {
        flyBehavior = new NoFlyBehavior();
    }
    @Override
    public void display() {
        System.out.println("玩具鸭");
    }
    //需要重写父类的所有方法
    public void quack() {
        System.out.println("玩具鸭不能叫~~");
    }
    public void swim() {
        System.out.println("玩具鸭不会游泳~~");
    }
}
//野鸭
class WildDuck extends Duck {


    //构造器,传入FlyBehavor 的对象
    public  WildDuck() {
        flyBehavior = new GoodFlyBehavior();
    }


    @Override
    public void display() {
        System.out.println(" 这是野鸭 ");
    }

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员黄小青

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值