设计模式之策略者模式

编写鸭子项目

在这里插入图片描述

传统方案解决鸭子问题的分析和代码实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H0JGQ1zt-1587560103286)(01BCA55D32294FAF817D8526566E2C6E)]

代码

public abstract class Duck {


    public Duck() {

    }

    /**
     * 显示鸭子信息
     */
    public abstract void display();

    public void quack(){
        System.out.println("鸭子嘎嘎叫");
    }

    public void swim(){
        System.out.println("鸭子游泳");
    }

    public void fly(){
        System.out.println("鸭子飞行");
    }
}
public class PekingDuck extends Duck {
    @Override
    public void display() {
        System.out.println("北京鸭");
    }

    /**
     * 因为北京鸭不能飞 因此需要重写fly
     */
    @Override
    public void fly() {
        System.out.println("北京鸭不能飞");
    }
}
public class ToyDuck extends Duck {
    @Override
    public void display() {
        System.out.println("玩具鸭");
    }

    /**
     * 需要重写父类所有方法
     */

    @Override
    public void quack(){
        System.out.println("玩具不能叫");
    }

    @Override
    public void swim(){
        System.out.println("玩具鸭子不游泳");
    }

    @Override
    public void fly(){
        System.out.println("玩具鸭子不飞行");
    }
}

public class WildDuck extends Duck {
    @Override
    public void display() {
        System.out.println("野鸭");
    }
}

传统的方式实现的问题分析和解决方案

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PTU2beHv-1587560103288)(6BBFCD79A5E64E9C8455C1648BDBCB83)]

策略者模式基本介绍

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-roTUVV2P-1587560103290)(DE6C661ED9064817BE0539E6CD76705E)]

原理类图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NiaQ5GnF-1587560103293)(8198EB62144F4DF7B79CFB92840638FA)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FKHnGoq0-1587560103295)(090CEF926906447785E5C0DD1AB42835)]

策略者模式解决鸭子问题

思路分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-voZypEII-1587560103298)(B38640D20912475A878241819A2D86F4)]

代码

public interface FlyBehavior {

    /**
     * 子类实现
     */
    void fly();

}

public abstract class Duck {


    /**
     * 聚合,策略接口
     */
    FlyBehavior flyBehavior;

    public Duck() {

    }

    /**
     * 显示鸭子信息
     */
    public abstract void display();

    public void quack(){
        System.out.println("鸭子嘎嘎叫");
    }

    public void swim(){
        System.out.println("鸭子游泳");
    }

    public void fly(){
       if (flyBehavior != null){
           flyBehavior.fly();
       }
    }



    public void setFlyBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }
}
public class BadFlyBehavior implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("飞的一般");
    }
}
public class GoodFlyBehavior implements FlyBehavior{
    @Override
    public void fly() {
        System.out.println("飞翔牛逼");
    }
}

public class NoFlyBehavior implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("不会飞");
    }
}

public class PekingDuck extends Duck {
    @Override
    public void display() {
        System.out.println("北京鸭");
    }

    public PekingDuck() {
        flyBehavior = new BadFlyBehavior();
    }
}

public class ToyDuck extends Duck {
    @Override
    public void display() {
        System.out.println("玩具鸭");
    }

    /**
     * 需要重写父类所有方法
     */

    @Override
    public void quack(){
        System.out.println("玩具不能叫");
    }

    @Override
    public void swim(){
        System.out.println("玩具鸭子不游泳");
    }

    public ToyDuck() {
        flyBehavior = new NoFlyBehavior();
    }
}

public class WildDuck extends Duck {
    @Override
    public void display() {
        System.out.println("野鸭");
    }


    /**
     * 传入FlyBehavor
     */
    public WildDuck() {
        flyBehavior = new GoodFlyBehavior();
    }
}

public class Client {

    public static void main(String[] args) {
        WildDuck wildDuck = new WildDuck();
        wildDuck.fly();

        ToyDuck toyDuck = new ToyDuck();
        toyDuck.fly();

        PekingDuck pekingDuck = new PekingDuck();
        pekingDuck.fly();

        //动态改变某个对象的行为
        pekingDuck.setFlyBehavior(new NoFlyBehavior());
        pekingDuck.fly();

    }

}

策略者模式在JDK-Arrays应用的源码分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sQ66XTgR-1587560103300)(F058A4A001E0470A8BE576C3CB175A5F)]

策略者模式的注意事项和细节

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-69gtigsi-1587560103303)(AFF0374717814BD998C359B51E1B701B)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值