当前位置:首页 > 文章列表 > 文章 > java教程 > Java的策略模式用代码怎么实现

Java的策略模式用代码怎么实现

来源:亿速云 2024-04-18 15:33:37 0浏览 收藏

对于一个文章开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《Java的策略模式用代码怎么实现》,主要介绍了,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

    策略模式

    策略模式属于Java 23种设计模式中行为模式之一,那先看看什么是策略模式。

    1、什么是策略模式

    策略模式的定义:

    该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。

    其实我们在现实生活中常常遇到实现某种目标存在多种策略可供选择的情况,例如,出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等。或者比如网购,你可以选择工商银行、农业银行、建设银行等等,但是它们提供的算法都是一致的,就是帮你付款。

    在软件开发中也会遇到相似的情况,当实现某一个功能存在多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。

    2、策略模式的优缺点

    优点:

    • 多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句

    • 提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码

    • 提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的

    • 提供了对开闭原则的完美支持,可以在不修改原代码的情况下,灵活增加新算法把算法

    • 的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离

    缺点:

    • 客户端必须理解所有策略算法的区别,以便适时选择恰当的算法类

    • 策略模式造成很多的策略类,增加维护难度

    3、策略模式的结构

    1.抽象策略类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。

    2.具体策略类:实现了抽象策略定义的接口,提供具体的算法实现。

    3.环境类:持有一个策略类的引用,最终给客户端调用。

    结构图:

    Java的策略模式用代码怎么实现

    4、代码实现

    现在有三只鸭子: 绿毛鸭、红毛鸭、小鸭子(小鸭子还不会飞)

    现在定义一个鸭子的父类:里面有都会叫的方法,有显示外观的方法(因为每只都不一样,就需要子类重写)

    还会飞行 (这里使用策略模式)

    public  abstract class duck {
        //鸭子都会叫:
        public void quack(){
            System.out.println("嘎嘎嘎");
        }
        //鸭子的外观,因为都不一样,所以由子类去实现
        public abstract void display();
    	
    	//以下使用策略模式:
        //在父类中持有该接口,并由该接口代替飞行行为(组合)
        private Flying flying;
        //提供set方法
        public void setFlying(Flying flying) {
            this.flying = flying;
        }
        public void fly(){
            flying.Fly();
        }
    }

    定义一个飞行接口:

    /**
     * 策略接口:实现了鸭子的飞行行为
     */
    public interface Flying {
        void Fly();
    }

    我们知道策略模式就是把需要用的算法封装起来,就在另一个内封装了会飞不会飞的两个方法:

    会飞(继承至上面的飞行接口,重写飞行方法):

    public class FlyWithWin implements Flying {
        @Override
        public void Fly() {
            System.out.println("我会飞");
        }
    }

    不会飞:

    public class FlyNoWay implements Flying {
        @Override
        public void Fly() {
            System.out.println("我不会飞行");
        }
    }

    注意: 上面这两个方法我是把他们单独封装起来,当做算法族,然后程序需要使用里面某个算法的时候,程序不会受算法改变的影响,因为这里面的算法最终效果是一致的

    红毛鸭类:

    /**
     * 红色鸭子
     */
    public class RedDuck extends duck{
        public RedDuck(){
            super();
            //给鸭子注入飞行的能力,这里就是通过算法族里面的会飞的算法
            super.setFlying(new FlyWithWin());
        }
        @Override
        public void display() {
            System.out.println("我是红色的鸭子");
        }
    }

    绿毛鸭:

    /**
     *
     * 绿色鸭子
     */
    public class GreenDuck extends duck{
        public GreenDuck(){
            super();
            //给鸭子注入飞行的能力,这里也是通过算法族里面的会飞的算法
            super.setFlying(new FlyWithWin());
        }
        @Override
        public void display() {
            System.out.println("我是绿色的鸭子");
        }
    }

    小鸭子类(不会飞):

    /**
     * 小鸭子,还不会飞
     */
    public class SamllDuck extends duck{
        public SamllDuck(){
            super();
            //小鸭子不会飞,所以使用了算法族里面不会飞的算法
            super.setFlying(new FlyNoWay());
        }
    
        @Override
        public void display() {
            System.out.println("我还是小鸭子");
        }
        //因为小鸭子和大鸭子的叫声不一样,所以重写叫声方法
        public void quack(){
            System.out.println("嘎~嘎~嘎");
        }
    }

    测试类:

    public class Test {
        public static void main(String[] args) {
            System.out.println("***测试鸭子程序***");
            duck d = null;
    		//这下面是轮流运行!!!!  
            d = new RedDuck();  //测试红色的鸭子
            d = new GreenDuck();  //测试绿色的鸭子
            d = new SamllDuck();  //测试小鸭子
            d.display();
            d.quack();
            d.fly();
            System.out.println("***测试完毕***");
        }
    }

    当使用红毛鸭为对象时:

    ***测试鸭子程序***
    我是红色的鸭子
    嘎嘎嘎
    我会飞
    ***测试完毕***

    当使用绿毛鸭为对象时:

    ***测试鸭子程序***
    我是绿色的鸭子
    嘎嘎嘎
    我会飞
    ***测试完毕***

    当使用小鸭子为对象时:

    ***测试鸭子程序***
    我还是小鸭子
    嘎~嘎~嘎
    我不会飞行
    ***测试完毕***

    5、策略模式的应用场景

    1.一个系统需要动态地在几种算法中选择一种时,可将每个算法封装到策略类中

    2.一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,可将每个条件分支移入它们各自的策略类中以代替这些条件语句

    3.系统中各算法彼此完全独立,且要求对客户隐藏具体算法的实现细节时

    4.系统要求使用算法的客户不应该知道其操作的数据时,可使用策略模式来隐藏与算法相关的数据结构

    5.多个类只区别在表现行为不同,可以使用策略模式,在运行时动态选择具体要执行的行为

    本篇关于《Java的策略模式用代码怎么实现》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于文章的相关知识,请关注golang学习网公众号!

    版本声明
    本文转载于:亿速云 如有侵犯,请联系study_golang@163.com删除
    Golang 函数文档中的哪些字段用于描述函数的泛型限制?Golang 函数文档中的哪些字段用于描述函数的泛型限制?
    上一篇
    Golang 函数文档中的哪些字段用于描述函数的泛型限制?
    SpringBoot的profile多环境切换怎么实现
    下一篇
    SpringBoot的profile多环境切换怎么实现
    查看更多
    最新文章
    查看更多
    课程推荐
    • 前端进阶之JavaScript设计模式
      前端进阶之JavaScript设计模式
      设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
      542次学习
    • GO语言核心编程课程
      GO语言核心编程课程
      本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
      508次学习
    • 简单聊聊mysql8与网络通信
      简单聊聊mysql8与网络通信
      如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
      497次学习
    • JavaScript正则表达式基础与实战
      JavaScript正则表达式基础与实战
      在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
      487次学习
    • 从零制作响应式网站—Grid布局
      从零制作响应式网站—Grid布局
      本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
      484次学习
    查看更多
    AI推荐
    • AI Make Song:零门槛AI音乐创作平台,助你轻松制作个性化音乐
      AI Make Song
      AI Make Song是一款革命性的AI音乐生成平台,提供文本和歌词转音乐的双模式输入,支持多语言及商业友好版权体系。无论你是音乐爱好者、内容创作者还是广告从业者,都能在这里实现“用文字创造音乐”的梦想。平台已生成超百万首原创音乐,覆盖全球20个国家,用户满意度高达95%。
      17次使用
    • SongGenerator.io:零门槛AI音乐生成器,快速创作高质量音乐
      SongGenerator
      探索SongGenerator.io,零门槛、全免费的AI音乐生成器。无需注册,通过简单文本输入即可生成多风格音乐,适用于内容创作者、音乐爱好者和教育工作者。日均生成量超10万次,全球50国家用户信赖。
      13次使用
    •  BeArt AI换脸:免费在线工具,轻松实现照片、视频、GIF换脸
      BeArt AI换脸
      探索BeArt AI换脸工具,免费在线使用,无需下载软件,即可对照片、视频和GIF进行高质量换脸。体验快速、流畅、无水印的换脸效果,适用于娱乐创作、影视制作、广告营销等多种场景。
      13次使用
    • SEO标题协启动:AI驱动的智能对话与内容生成平台 - 提升创作效率
      协启动
      SEO摘要协启动(XieQiDong Chatbot)是由深圳协启动传媒有限公司运营的AI智能服务平台,提供多模型支持的对话服务、文档处理和图像生成工具,旨在提升用户内容创作与信息处理效率。平台支持订阅制付费,适合个人及企业用户,满足日常聊天、文案生成、学习辅助等需求。
      16次使用
    • Brev AI:零注册门槛的全功能免费AI音乐创作平台
      Brev AI
      探索Brev AI,一个无需注册即可免费使用的AI音乐创作平台,提供多功能工具如音乐生成、去人声、歌词创作等,适用于内容创作、商业配乐和个人创作,满足您的音乐需求。
      18次使用
    微信登录更方便
    • 密码登录
    • 注册账号
    登录即同意 用户协议隐私政策
    返回登录
    • 重置密码