0

0

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

王林

王林

发布时间:2023-05-18 17:49:34

|

1755人浏览过

|

来源于亿速云

转载

    策略模式

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

    1、什么是策略模式

    策略模式的定义:

    该设计模式封装了一系列算法,使它们能够相互替换,而算法变化不会对客户端使用造成影响。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。

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

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

    立即学习Java免费学习笔记(深入)”;

    2、策略模式的优缺点

    优点:

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

    • 通过继承,可以将算法族的公共代码放在父类中,以避免代码重复使用,并提供了一系列可重用的算法

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

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

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

    缺点:

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

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

    3、策略模式的结构

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

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

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

    结构图:

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

    4、代码实现

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

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

    Giiso写作机器人
    Giiso写作机器人

    Giiso写作机器人,让写作更简单

    下载

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

    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速学教程(入门到精通)
    java速学教程(入门到精通)

    java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

    下载

    相关标签:

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    相关专题

    更多
    Java编译相关教程合集
    Java编译相关教程合集

    本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

    11

    2026.01.21

    C++多线程相关合集
    C++多线程相关合集

    本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

    4

    2026.01.21

    无人机驾驶证报考 uom民用无人机综合管理平台官网
    无人机驾驶证报考 uom民用无人机综合管理平台官网

    无人机驾驶证(CAAC执照)报考需年满16周岁,初中以上学历,身体健康(矫正视力1.0以上,无严重疾病),且无犯罪记录。个人需通过民航局授权的训练机构报名,经理论(法规、原理)、模拟飞行、实操(GPS/姿态模式)及地面站训练后考试合格,通常15-25天拿证。

    16

    2026.01.21

    Python多线程合集
    Python多线程合集

    本专题整合了Python多线程相关教程,阅读专题下面的文章了解更多详细内容。

    1

    2026.01.21

    java多线程相关教程合集
    java多线程相关教程合集

    本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

    4

    2026.01.21

    windows激活码分享 windows一键激活教程指南
    windows激活码分享 windows一键激活教程指南

    Windows 10/11一键激活可以通过PowerShell脚本或KMS工具实现永久或长期激活。最推荐的简便方法是打开PowerShell(管理员),运行 irm https://get.activated.win | iex 脚本,按提示选择数字激活(选项1)。其他方法包括使用HEU KMS Activator工具进行智能激活。

    2

    2026.01.21

    excel表格操作技巧大全 表格制作excel教程
    excel表格操作技巧大全 表格制作excel教程

    Excel表格操作的核心技巧在于 熟练使用快捷键、数据处理函数及视图工具,如Ctrl+C/V(复制粘贴)、Alt+=(自动求和)、条件格式、数据验证及数据透视表。掌握这些可大幅提升数据分析与办公效率,实现快速录入、查找、筛选和汇总。

    6

    2026.01.21

    毒蘑菇显卡测试网站入口 毒蘑菇测试官网volumeshader_bm
    毒蘑菇显卡测试网站入口 毒蘑菇测试官网volumeshader_bm

    毒蘑菇VOLUMESHADER_BM测试网站网址为https://toolwa.com/vsbm/,该平台基于WebGL技术通过渲染高复杂度三维分形图形评估设备图形处理能力,用户可通过拖动彩色物体观察画面流畅度判断GPU与CPU协同性能;测试兼容多种设备,但中低端手机易卡顿或崩溃,高端机型可能因发热降频影响表现,桌面端需启用独立显卡并使用支持WebGL的主流浏览器以确保准确结果

    25

    2026.01.21

    github中文官网入口 github中文版官网网页进入
    github中文官网入口 github中文版官网网页进入

    github中文官网入口https://docs.github.com/zh/get-started,GitHub 是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。 通过将代码存储在GitHub 上的“存储库”中,你可以: “展示或共享”你的工作。 持续“跟踪和管理”对代码的更改。

    7

    2026.01.21

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    Kotlin 教程
    Kotlin 教程

    共23课时 | 2.7万人学习

    C# 教程
    C# 教程

    共94课时 | 7.2万人学习

    Java 教程
    Java 教程

    共578课时 | 48.8万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号