行为型模式11之3-Strategy策略模式例子理解

ps:
面向接口编程,而不是面向实现编程。
多用组合,少用继承。

策略模式,可复用、又可变更。

策略模式中的设计原则,
1、组合一个策略对象,将飞行行为代理给该对象的实现
交由飞行策略接口,由飞行实现去完成
FlyStragedy:FlyWithRocket、FlyNoWay、FlyWithWing(多态)
2、面向接口,而不是面向工程实现
接口提供契约,规范总体框架
3、多用组合,少用继承

策略模式的实现要点:
1、分离变化,得出策略接口;
2、写出多个该接口的实现类;
3、客户程序持有一个策略接口;
4、在客户程序中选择/组装正确的策略实现(注入)。

优点:
1、使用组合,架构更加灵活;
2、富有弹性,可较好地应对变化(开闭原则);
3、更换的代码复用性(相对于继承);
4、消除大量的条件语句,可读性,面向对象易于维护。

缺点:
1、客户代码需要了解每个策略实现的细节;
每个客户代码都需要注入一个策略实现。
2、增加了对象的数目,要写多个实现类,增加了维护的困难。

适用场景:
1、许多相关的类仅仅是行为差异;
2、运行时选取不同的算法变体;
3、通过调节语句在多个分支选取其一。

1.抽象基类

package com.test.strategymodel;

/**
 * 抽象基类
 * @author Administrator
 *
 */
public abstract class Duck {

    /*
     * 显示鸭子的外观 鸭子的外观各不相同,声明为abstract, 由子类实现
     */
    public abstract void display();

    /*
     * 鸭子发出叫声 通用行为,由超类实现
     */
    public void say() {
        System.out.println("嘎嘎嘎");
    }

    public void fly() {
        // 调用接口方法
        flyStragetyInterface.performFly();
    }

    // 组合关联 接口
    private FlyStragetyInterface flyStragetyInterface;

    public void setFlyStragetyInterface(FlyStragetyInterface flyStragetyInterface) {
        this.flyStragetyInterface = flyStragetyInterface;
    }
}

2.MallardDuck

package com.test.strategymodel;

public class MallardDuck extends Duck{

    public MallardDuck() {
        // TODO Auto-generated constructor stub
        //设置具体的飞行接口实现
        super.setFlyStragetyInterface(new FlyStragetyInterfaceImpl4Win());
    }
    @Override
    public void display() {
        // TODO Auto-generated method stub
        System.out.println("显示出一只绿头鸭");
    }


}

3.RedheadDuck

package com.test.strategymodel;

public class RedheadDuck extends Duck {

    public RedheadDuck() {
        // TODO Auto-generated constructor stub
        //设置具体的飞行接口实现
        super.setFlyStragetyInterface(new FlyStragetyInterfaceImpl4Win());
    }

    @Override
    public void display() {
        // TODO Auto-generated method stub
        System.out.println("显示出一只红头鸭");
    }

}

4.FlyStragetyInterface

package com.test.strategymodel;

public interface FlyStragetyInterface {
    void performFly();
}

5.impl

package com.test.strategymodel;

public class FlyStragetyInterfaceImpl4NoFly implements FlyStragetyInterface{

    @Override
    public void performFly() {
        // TODO Auto-generated method stub
        System.out.println("不会飞");
    }

}

6.impl

package com.test.strategymodel;

public class FlyStragetyInterfaceImpl4Win implements FlyStragetyInterface{

    @Override
    public void performFly() {
        // TODO Auto-generated method stub
        System.out.println("用翅膀飞");
    }

}

7.impl

package com.test.strategymodel;

public class FlyStragetyInterfaceImpl4Rocket implements FlyStragetyInterface{

    @Override
    public void performFly() {
        // TODO Auto-generated method stub
        System.out.println("用火箭飞");
    }

}

8.

package com.test.strategymodel;

public class RubberDuck extends Duck{

    public RubberDuck() {
        // TODO Auto-generated constructor stub
        //RubberDuck 不会飞  
        super.setFlyStragetyInterface(new FlyStragetyInterfaceImpl4NoFly());
    }

    @Override
    public void display() {
        // TODO Auto-generated method stub
        System.out.println("显示出一只RubberDuck");
    }
    //这里表现出say方法是有缺陷的 因为不是必须要覆盖的
    @Override
    public void say() {
        // TODO Auto-generated method stub
        //super.say();
        System.out.println("G~G~G~");
    }

}

9.

package com.test.strategymodel;

public class BigYellowDuck extends Duck{

    public BigYellowDuck() {
        // TODO Auto-generated constructor stub
        //大黄鸭不会飞  
        super.setFlyStragetyInterface(new FlyStragetyInterfaceImpl4NoFly());
    }

    @Override
    public void display() {
        // TODO Auto-generated method stub
        System.out.println("显示出一只大黄鸭");
    }

}

10.

package com.test.strategymodel;

public class SpaceDuck extends Duck {

    public SpaceDuck() {
        // TODO Auto-generated constructor stub
        super.setFlyStragetyInterface(new FlyStragetyInterfaceImpl4Rocket());
    }

    @Override
    public void display() {
        // TODO Auto-generated method stub
        System.out.println("显示出一只SpaceDuck");
    }

    @Override
    public void say() {
        System.out.println("我通过无线电say");
    }
}

11.test

package com.test.strategymodel;

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // Duck duck = new MallardDuck();最原始的方式
        // Duck duck = new RedheadDuck();//与MallardDuck一致
        // Duck duck =new BigYellowDuck();//不会飞
        // Duck duck =new RubberDuck();//不会飞 改变叫声
        Duck duck = new SpaceDuck();// 改变飞行方式 改变叫声
        //
        duck.display();
        duck.say();
        duck.fly();
    }

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值