第二十四章 策略模式

news2024/12/26 15:20:08

文章目录

  • 前言
    • 传统方式解决鸭子问题
    • 完整代码
    • 抽象鸭子类
    • 野鸭子类
    • 北京鸭子类
    • 玩具鸭子类
  • 一、策略模式基本介绍
  • 二、策略模式解决鸭子问题
    • 完整代码
    • 飞翔接口 FlyBehavior
    • 飞翔接口的子类实现
    • 飞翔技术高超 GoodFlyBehavior
    • 不会飞翔 NoFlyBehavior
    • 飞翔技术一般 BadFlyBehavior
    • 其他行为接口 QuackBehavior
    • 抽象鸭子类 Duck
    • 野鸭 WildDuck
    • 北京鸭 PekingDuck
    • 玩具鸭 ToyDuck
    • 测试类 Client
  • 三、策略模式在JDK-Arrays 应用的源码分析
  • 四、策略模式的注意事项和细节


前言

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

传统方式解决鸭子问题

完整代码

抽象鸭子类

package tanchishell.SJMS.strategy;

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("鸭子会飞翔~~~");
    }
}

野鸭子类

package tanchishell.SJMS.strategy;

public class WildDuck extends Duck {

    @Override
    public void display() {

        System.out.println(" 这是野鸭 ");
    }

}

北京鸭子类

package tanchishell.SJMS.strategy;

public class PekingDuck extends Duck{

    @Override
    public void display() {

        System.out.println("~~北京鸭~~~");
    }
    //因为北京鸭不能飞翔,因此需要重写 fly
    @Override
    public void fly() {

        System.out.println("北京鸭不能飞翔");
    }
}

玩具鸭子类

package tanchishell.SJMS.strategy;

public class ToyDuck extends Duck {

    @Override
    public void display() {

        System.out.println("玩具鸭");
    }

    //需要重写父类的所有方法
    public void quack() {
        System.out.println("玩具鸭不能叫~~");
    }

    public void swim() {
        System.out.println("玩具鸭不会游泳~~");
    }

    public void fly() {
        System.out.println("玩具鸭不会飞翔~~~");
    }
}

在这里插入图片描述


一、策略模式基本介绍

在这里插入图片描述
在这里插入图片描述

二、策略模式解决鸭子问题

在这里插入图片描述
在这里插入图片描述

完整代码

飞翔接口 FlyBehavior

package tanchishell.SJMS.strategy.improve;

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

飞翔接口的子类实现

飞翔技术高超 GoodFlyBehavior

package tanchishell.SJMS.strategy.improve;

public class GoodFlyBehavior implements FlyBehavior {

    @Override
    public void fly() {

        System.out.println(" 飞翔技术高超 ~~~");

    }
}

不会飞翔 NoFlyBehavior

package tanchishell.SJMS.strategy.improve;

public class NoFlyBehavior implements FlyBehavior {

    @Override
    public void fly() {

        System.out.println(" 不会飞翔 ");
    }

}

飞翔技术一般 BadFlyBehavior

package tanchishell.SJMS.strategy.improve;

public class BadFlyBehavior implements FlyBehavior {

    @Override
    public void fly() {

        System.out.println(" 飞翔技术一般 ");
    }
}

其他行为接口 QuackBehavior

package tanchishell.SJMS.strategy.improve;

public interface QuackBehavior {
    void quack();//子类实现
}

抽象鸭子类 Duck

package tanchishell.SJMS.strategy.improve;

public abstract class Duck {

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

    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 void setQuackBehavior(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }
}

野鸭 WildDuck

package tanchishell.SJMS.strategy.improve;

public class WildDuck extends Duck {

    //构造器,传入 FlyBehavor 的对象
    public WildDuck() {

        flyBehavior = new GoodFlyBehavior();
    }
    @Override
    public void display() {

        System.out.println(" 这是野鸭 ");
    }
}

北京鸭 PekingDuck

package tanchishell.SJMS.strategy.improve;

public class PekingDuck extends Duck {

    //假如北京鸭可以飞翔,但是飞翔技术一般
    public PekingDuck() {

        flyBehavior = new BadFlyBehavior();
    }
    @Override
    public void display() {

        System.out.println("~~北京鸭~~~");
    }
}

玩具鸭 ToyDuck

package tanchishell.SJMS.strategy.improve;

public 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("玩具鸭不会游泳~~");
    }
}

测试类 Client

package tanchishell.SJMS.strategy.improve;

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());
        System.out.println("北京鸭的实际飞翔能力");
        pekingDuck.fly();
    }
}


输出

 飞翔技术高超 ~~~
 不会飞翔 
 飞翔技术一般 
北京鸭的实际飞翔能力
 不会飞翔 

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

在这里插入图片描述

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/493054.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文献阅读 Meta-SR: A Magnification-Arbitrary Network for Super-Resolution

题目 Meta-SR: A Magnification-Arbitrary Network for Super-Resolution Meta-SR: 用于超分辨率的任何放大网络 摘要 由于DCNN的发展&#xff0c;最近关于超分辨率的研究取得了巨大成功。然而&#xff0c;任意比例因子的超分辨率长期以来一直被忽视。以往的研究者大多将不同…

Stable-Diffusion AI画画本地搭建详细步骤

ChatGPT出来后&#xff0c;第一次感觉到人工智能真的可能要来了&#xff0c;因此也顺便尝试了下开源AI画画的搭建。网络上写的教程总是不那么面面俱到&#xff0c;因此本文参考了3篇文章才成功把Stable-Diffusion 本地搭建搭建了起来。参考教程在文末。 本文是本地搭建AI画画&a…

C/C++内存泄露检查利器—valgrind

1、Valgrind概述 Valgrind是一套Linux下&#xff0c;开放源代码&#xff08;GPL V2&#xff09;的仿真调试工具的集合。 Valgrind由内核&#xff08;core&#xff09;以及基于内核的其他调试工具组成。内核类似于一个框架&#xff08;framework&#xff09;&#xff0c;它模拟…

Android中的GPS开发

GPS简介 Gobal Positioning System&#xff0c;全球定位系统&#xff0c;是美国在20世纪70年代研制的一种以人造地球卫星为基础的高精度无线电导航的定位系统&#xff0c;它在全球任何地方以及近地空间都能够提供准确的地理位置、车行速度及精确的时间信息&#xff1b;它是具有…

2023年房地产抵押贷款研究报告

第一章 概述 房地产抵押贷款是一种以房地产为抵押品的贷款形式&#xff0c;包括个人和企业两种情况。个人房地产抵押贷款是指个人将名下房产作为抵押品向银行或其他金融机构申请贷款&#xff0c;而企业房地产抵押贷款则是指企业将自己名下的商业房产作为抵押品向金融机构申请贷…

202309读书笔记|《野性之美:非洲野生动物初窥》——走进自然界的野性之美

《野性之美: 非洲野生动物初窥》微读的一本书&#xff0c;图片居多&#xff0c;非常有视觉上的震撼。拍摄者也是我们孙姓的一员&#xff0c;孙长智。正如作者所说&#xff0c;与自然对话&#xff0c;你会感悟到生命之美、竞争之美、进化之美、和谐之美&#xff01; 我喜欢自然…

SPSS如何绘制常用统计图之案例实训?

文章目录 0.引言1.绘制简单条形图2.绘制分类条形图3.绘制分段条形图4.绘制简单线图5.绘制多重线图6.绘制垂直线图7.绘制简单面积图8.绘制堆积面积图9.绘制饼图10.绘制直方图11.绘制简单散点图12.绘制重叠散点图13.绘制矩阵散点图14.绘制三维散点图15.绘制简单箱图16.绘制分类箱…

【markdown工具配合图床】PicGo图床配置教程,一秒读懂配置

前言 看到这篇文章的大佬&#xff0c;我默认大家都会配置git&#xff0c;已经配置好ssh公钥。 此时你看到的这篇文章就是基于markdown工具&#xff08;VSCode&#xff0c;Typora&#xff09;编写的。 PicGo作为图床转换工具&#xff0c;并配合gitee作为图片服务器&#xff0…

java元注解和自定义注解的区别

Java的元注解和自定义注解是两个不同的概念。 元注解是Java内置的一组用于修饰其他注解的注解&#xff0c;包括Retention、Target、Inherited和Documented。它们可以控制被修饰的注解的保留策略、目标范围、是否继承等属性&#xff0c;并且可以在编写自定义注解时使用。 Retent…

国考省考结构化面试:综合分析题,社会现象(积极消极政策)、名言哲理(警句观点启示)、漫画反驳题等

国考省考结构化面试&#xff1a;综合分析题&#xff0c;社会现象&#xff08;积极消极政策&#xff09;、名言哲理&#xff08;警句观点启示&#xff09;、漫画反驳题等 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能&#xff0c;附带行测和申论&…

【Java数据结构】优先级队列(堆)

优先级队列&#xff08;堆&#xff09; 概念模拟实现堆的概念堆的存储方式堆的创建向下调整堆的创建建堆的时间复杂度 堆的插入和删除堆的插入堆的删除 用堆模拟实现优先级队列 常用接口PriorityQueue的特性PriorityQueue常用接口介绍构造方法插入/删除/获取优先级最高的元素 P…

孙溟㠭篆刻,红木上的‘’椎凿稚趣‘’

了解中国传统篆刻的人&#xff0c;一定知道篆刻作品中追求的“金石气”。作为拥有3700多年历史的中国传统艺术&#xff0c;篆刻艺术是将书法&#xff08;主要是篆书&#xff09;和镌刻&#xff08;包括凿、铸&#xff09;相结合&#xff0c;制作印章&#xff0c;亦是汉字独有的…

Vivado 仿真器中以批处理或脚本模式(Batch or Scripted Mode)进行仿真

以下说明来自ug900:在 Vivado 仿真器中以批处理或脚本模式进行仿真 具体可以内容可自行查找 其中代码运行截图为自己实践的实例 Note: xelab, xvlog and xvhdl are not Tcl commands. The xvlog, xvhdl, xelab are Vivado-independent compiler executables. Hence, there is…

20230505使用amazon来批量翻译SRT格式的日语字幕为简体中文

20230505使用amazon来批量翻译SRT格式的日语字幕为简体中文 2023/5/5 19:03 百度搜索&#xff1a;使用 amazon 批量翻译 请严重注意&#xff1a;可能会扣费的&#xff01; https://aws.amazon.com/cn/blogs/china/translating-documents-with-amazon-translate-aws-lambda-and…

线性判别分析LDA计算例题详解

线性判别分析(Linear Discriminant Analysis, LDA)的核心思想是&#xff1a;将给定训练集投影到特征空间的一个超平面上&#xff0c;并设法使同类样本投影点尽可能接近&#xff0c;异类样本投影点尽可能远离 由于做题时针对的是解题过程&#xff0c;因此原理相关方面省略&#…

回文数:探索数字世界中的对称美学

本篇博客我会讲解力扣中的“9. 回文数”这道题&#xff0c;大家重点理解判断回文数的方法。 先来审题&#xff1a;这是题目链接。 来看几个输出示例&#xff1a; 还有一些条件&#xff1a; 第一反应是&#xff1a;为啥是个整数呢&#xff1f;万一是个字符串&#xff0c;那不…

windows下安装OpenCL

由于我的电脑是windows10&#xff0c;显卡是集显Intel UHD Graphics 630。 下载Intel的SDK for OpenCL&#xff0c;下载地址https://software.intel.com/en-us/opencl-sdk/choose-download&#xff0c;也可以在我的资源里面直接下载https://download.csdn.net/download/qq_363…

System verilog【2】字符串,函数,任务

前言 素手青颜光华发&#xff0c;半世尘缘半世沙。我唤青天睁开眼&#xff0c;风霜怎奈并蒂花 \;\\\;\\\; 目录 前言字符串packed组合型结构体组合型数组 过程块initial & always functiontask 字符串 module chertanis;initial beginstring s"hola,mundo!",s2…

Java 多线程知识

参考链接&#xff1a;https://www.cnblogs.com/kingsleylam/p/6014441.html https://blog.csdn.net/ly0724ok/article/details/117030234/ https://blog.csdn.net/jiayibingdong/article/details/124674922 导致Java线程安全问题最主要的原因&#xff1a; &#xff08;1&#…

修改亮度、对比度、色调、饱和度,达到预期效果

用户态可以通过v4l2自带工具进行一些UVC相机参数的设定&#xff0c;包括采集卡驱动之类&#xff0c;也可以通过v4l2自带工具进行参数设定。 通过修改这些参数的值&#xff0c;可以弥补相机本身彩色部分自带不足。 总的来说就这么几种命令&#xff1a; 查看设备所有参数信息&a…