学习总结与分享-浅析java的多态与策略模式

代码度量工具SourceMonitor:从圈复杂度到工程实践的质量守护 在软件工程领域,代码质量是决定项目长期可维护性的核心要素。静态代码分析技术通过在不运行程序的情况下扫描源代码,量化评估其结构特性,为开发者提供了客观的质量洞察。其核心价值在于将主观的“代码感觉”转化为可度量的数据,帮助团队提前识别技术债务与潜在风险。圈复杂度作为衡量逻辑复杂度的关键指标,与函数语句数、嵌套深度、注释率等共同构成了代码的“健康体检表”。这些度量数据在持续集成流水线、代码审查及日常开发中,能有效驱动重构决策与质量改进。本文以SourceMonitor工具为例,深入解读如何利用代码度量数据优化工程 阅读详情

  多态,是java三大面向对象的特性之一,其他还有封装和继承,有时人们也会将抽象算进去,称为四大特性。在日常写代码时,我们基本每天都在看到使用到多态,那么,什么是多态呢,又该怎么正确使用呢,这就是今天要去研究的了。。

1.什么是多态:
  其实提到多态就不得不提到继承,因为要实现多态,首先第一点必须要有继承一个父类,然后重写或实现其中的方法,最后用最简单的一句话就是:父类型的引用指向子类型的对象。用一句比较通俗的话:同一操作作用于不同的对象,可以产生不同的效果。这就是多态。
在这里插入图片描述
2.多态的作用:
  使用多态可以解决项目中紧偶合的问题,提高程序的可扩展性.是OOP原则的一个具体的实现,应用程序不必为每一个子类编写功能调用,只需要对父类进行处理即可。大大提高程序的可复用性。子类的功能也可以被基类的方法或引用变量所调用,向后兼容,可以提高可扩充性和可维护性。
在这里插入图片描述
  介绍完了多态,也是回顾一下java基础的特性,在23种设计模式中,也有一种设计模式借鉴的多态的思想,“策略模式”。
  设计模式是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样(取自百度百科)那么23种设计模式中的策略模式又是什么样的呢?

策略模式的思想:
  策略模式的思想是针对一组算法,将每一种算法都封装到具有共同接口的独立的类中,从而是它们可以相互替换。策略模式的最大特点是使得算法可以在不影响客户端的情况下发生变化,从而改变不同的功能。策略模式体现了面向对象程序设计中非常重要的两个原则:
  封装变化的概念。
  编程中使用接口,而不是使用的是具体的实现类(面向接口编程)。
实现策略模式需要的三个基础角色:
  上下文角色(Context):用来操作策略的上下文环境,屏蔽高层模块(客户端)对策略,算法的直接访问,封装可能存在的变化。
  抽象策略角色(Strategy):规定策略或算法的行为。
  具体策略角色(ConcreteStrategy):具体的策略或算法实现。
举个例子:
  假设现在有两个数与一个运算符,要求使用该运算符操作这两个数。不使用策略模式的话,我们可以通过判断运算符符号,对这两个数进行运算。

	public class Calculator {
    public int calc(int a, int b, final String symbol) {
        int result = 0;
        if ("+".equals(symbol)) {
            result = a + b;
        } else if ("-".equals(symbol)) {
            result = a - b;
        }
        return result;
    }
}

  但是这样写的话,如果我们现在要扩展乘法*或除法/运算,那么就要在calc方法内增加对应的if…else判断,代码臃肿并且扩展性太低。
而如果采用策略模式,将各种运算符的计算都归并到对应具体策略,这样,就能简化代码并且带来很好的扩展性,具体代码如下:

public class Client {
    public static void main(String[] args) {
        ICalculator calculator = new Add();
        Context context = new Context(calculator);
        int result = context.calc(1,2);
        System.out.println(result);
    }

   public interface ICalculator {
        int calc(int a, int b);
    }

    public static class Add implements ICalculator {
        @Override
        public int calc(int a, int b) {
            return a + b;
        }
    }

  public static class Sub implements ICalculator {
        @Override
        public int calc(int a, int b) {
            return a - b;
        }
    }

 public  static class Multi implements ICalculator {
        @Override
        public int calc(int a, int b) {
            return a * b;
        }
    }

   public  static class Divide implements ICalculator {
        @Override
        public int calc(int a, int b) {
            return a / b;
        }
    }

   public  static class Context {
        private ICalculator mCalculator;

        public Context(ICalculator calculator) {
            this.mCalculator = calculator;
        }

      public   public int calc(int a, int b) {
            return this.mCalculator.calc(a, b);
        }
    }
}

  从上面代码中,我们可以看到,我们完全消除了对运算符号进行判断的哪些if…else的冗余代码,取而代之的是用户直接决定使用哪种算法,然后交由上下文获取结果。并且上面代码中我们还扩展了乘法Multi和除法Divide运算,所需要做的就只是扩展相应的策略类而已。
但是每一种设计模式的优点虽然是明显的,可也是会有一些缺点的,所以我们要了解这些缺点,在实际场景中,尽量的避免缺点的产生。

策略模式的优缺点:
优点:
  1.消除了if…else冗余代码的使用,让代码更加干净。
  2.易于扩展,当我们需要不同的逻辑时只需要添加相应的策略类即可。
  3.易于维护,针对不同的功能,我们只需要维护相对应的策略类即可。
  4.职责清晰,策略模式只针对同一类型问题进行解决。
缺点:
  1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。
  2.由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。

从Java多态到策略模式 先来复习下java多态:java多态指的是父类引用指向子类对象,不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。   接下来我们再说下什么叫策略模式:将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。   可能说了这么多你还没明白什么事策略模式,接下我们来举个例子   玩过LOL的同学都知道,LOL有上百个英雄,如果用OO技术来设计这些英雄该怎么办?   小肖:简单,先来个父类(Superclass),然后让所有的英雄继承此父类,不同的方法重写父类方法即可。   立即下载

相关推荐

英飞凌 AURIX Development Studio工程移植到Hightec的方法

1. 软件简介 AURIX™ Development Studio是英飞凌针对AURIX TC2XX/TC3XX系列单片机推出了一款免费的软件,集成了iLLD库,内置Tasking compiler和Tasking Debugger,但这两个模块只能用于非商业用途,可供学习和试用。iLLD库是英飞凌为TC2XX和TC3XX Tricore系列单片机提供的底层驱动库,有完善的使用手册,和较好的移植性。 Hightec是一款可以用来开发Aurix系列单片机的编译器,有免费版,可商用,集成GCC编译器,可用UDE

weixin_42967006的博客 7137

多态和策略模式

今天我们继续来讲解一下有关于多态和策略模式 多态 说到多态,我们都知道这是java的特性(继承,封装,多态,抽象)之一,但是我们对他了解多少呢? 我们首先了解一下它的概念: 相同类型的变量,调用同一个方法时呈现出多种不同的行为特征,主要是通过继承来实现,将子类对象直接赋给父类引用变量,这样在编译时引用变量类型是父类类型,而运行时类型是子类类型,导致运行时调用该引用变量的方法总会表现子类方法,而调用...

此男子淡漠 2297

步进电机 cia402协议 报文自己的理解 (笔记)

步进电机 cia402协议 报文自己的理解 (笔记)

she666666的博客 3805

java基础学习之多态和策略模式

java三大特性:继承、封装、多态. 今天学习一下多态, 多态的三要素: 继承、重写(overWrite区别于overLoad)、父类引用指向子类对象. 多态的基础是继承, 先来复习一下继承. 继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能...

choukao4407的博客 443

ARIMA模型的R实现

1.模型简介 ARIMA模型,全称差分自回归移动平均模型。可以看作是差分运算和ARMA模型的结合。主要是针对具有线性趋势的非平稳的时间序列,来进行建模预测。 ARIMA模型的形式如下: Φ(B)∇

heirenmin的博客 1万+

MBD-从一个示例看代码生成过程(rtw文件、TLC语言)

大概介绍了MBD代码生成流程,rtw文件、TLC语言

小胡同学的工程师学习之路 4214

多态、策略模式和简单工厂模式的理解

最近在看设计模式一本书,发现策略模式和简单工厂模式很像,刚刚开始我还以为是一样的,总感觉没什么区别,后来才看明白,有一点点个人的理解,记录下来,方便下次复习以及理解。 概念理解: 多态:C++的多态性用一句话概括就是,在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据   对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基

奋斗Andy的博客 3599

[RK3568 Android11] 教程之原厂SDK源码适配AIO-3568J板子跑起来

目录 一、前提 二、修改dts设备树 三、适配板子的dts 四、编译系统烧入固件验证 一、前提 因源码是直接使用原厂的SDK,没有使用firefly配套的SDK源码,所以手上这块firefly aio-3568j板子在硬件设计上与原厂使用的板子会有些差异;就是因为这些差异会导致新固件烧入后,debug串口打印许多错误信息,可能的话,系统还会崩溃掉,跑不起来; 主要差异在哪里呢?比如: ● DDR类型和品牌多样性; ...

~未来可期~ 1744

多态和策略模式的爱恨情仇

最近在研究设计模式,看的书是《head first设计模式》,后续会出一系列设计模式的专题,一方面自己总结,另一方面和大家共同学习。今天看的主要是策略模式,也就是书的开头,给人的感觉策略模式就是多态,想着肯定没这么简单于是搜索了大量资料进行总结。定义:        策略模式:定义了算法族,分别封装,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。        多态:1.继承  ...

邓盛余 1769

Calibre :Standard Verification Rule Format(SVRF) Manual (1-2)

摘要:SVRF规则文件是用于Calibre和ICverify工具的脚本文件,包含层定义、规则检查、注释、预处理指令等元素。规则文件支持全局/局部层定义、隐式层操作,以及条件编译指令(#DEFINE/#IFDEF等)。宏功能(DMACRO/CMACRO)可实现代码复用,支持参数化层操作和嵌套调用。预处理指令支持版本控制(#IFDEFCALIBRE_VERSION)和环境变量默认值设置(#PRAGMAENV)。宏中的层名具有局部作用域,可通过特殊语法实现全局层名指定,LOCAL()修饰符可创建调用作用域内的唯一

u013620135的博客 1339

Android 13 wificond讲解

Android 13 wificond讲解

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 2932

每天一个设计模式之(11)-----策略模式

1.为什么要使用策略模式 策略模式非常的简单,简单到就是java的多态性的表现,拥有抽象接口,调用者可以自行实例化需要的实例。 2.类图 Strategy是策略的抽象,Add,Sub是具体的实现,Context只拥有抽象策略对象。 3.实现 策略类 pu...

chupabao0888的博客 190

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

设计模式之策略模式和状态模式的区别

设计模式之策略模式和状态模式的区别 转策略模式与状态模式的比较 状态模式(state pattern)和策略模式(strategy pattern)的实现方法非常类似,都是利用多态把一些操作分配到一组相关的简单的类中,因此很多人认为这两种模式实际上是相同的。然而 在现实世界中,策略(如促销一种商品的策略)和状态(如同一个按钮来控制一个电梯的状态,又如手机界面中一个按钮来控制手机)是两种完全不同的思想。当我们对状态和策略进行建模时,这种差异会导致完全不同的问题。例如,对状态进行建模时,状态迁移是一个核心内容

weixin_46453756的博客 1326

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java基础(五):Java的多态

本文关于Java多态的介绍与深究

Justin_Andyson的博客 4993

设计模式之策略模式(Strategy Pattern),与 java语言的多态有点像(重点学习)

文章目录一、定义与特点1.1、定义1.2、优点:1.3、缺点:二、角色和UML类图2.1、主要角色如下:2.2、UML类图2.3、示例:2.3.1、Strategy2.3.2、ConcreteStrategyA2.3.3、ConcreteStrategyB2.3.4、ConcreteStrategyC2.3.5、Context:上下文的实现类2.3.6、Client三、鸭子项目示例3.1、需求:3...

猎人在吃肉 1153

设计模式--策略模式

多态:同一类型的指针或引用在指向不同子类对象时可以表现出不同的行为。我们知道多态最常见的实现方式就是基类定义虚函数,派生类通过继承基类的函数后,对基类函数重写来实现。但是在项目中,往往出现表现多态的类本身改动很小,而该类簇的行为改动频繁,(或者可能行为的实现时算法同学负责,而多态类时我们架构同学负责)那么我们把多态类视为使用行为的上下文,把行为从中抽象出来定义成行为类,这就引出了多态实现的另一种方式:通过继承基类的行为对象成员,然后派生类将成员初始化为不同的行为派生类对象,这样在调用行为类对象的方法时就能表

Android_chunhui的专栏 285

策略模式(Strategy Pattern)

策略模式是多态的一种具体应用。它的目的在于避免大量的判断语句,而是通过一组封装好的策略类,在运行时动态切换行为。本质上策略模式和判断语句实现的功能一样,但是增加了规范化,可维护性。🎨定义:策略模式是一种行为型设计模式,它将一组算法(或业务逻辑)封装为独立的策略类,使程序在运行时可以动态切换这些策略。🔍核心思想:将算法的定义与使用分离,让客户端通过统一接口动态切换策略,从而实现行为的灵活扩展和替换。促销计算:折扣、满减、秒杀等支付方式:支付宝、微信、银行卡出行选择:高铁、飞机、自驾。

weixin_43400806的博客 890

策略模式详解

什么是策略模式 策略模式也叫政策模式,他将定义的算法家族、分别封装起来,让他们之间可以相互替换,从而让算法的变化不会影响到使用算法的用户。属于行为型模式。 策略模式使用的就是面向对象的继承和多态机制,从而实现同一行为在不同场景下具备不同实现。 应用场景 策略模式在生活中应用很多。比如一个人的胶水比例与他的工资有关,不同的工资水平对应不同的税率;再比如我们在下单前需要选择支付方式,比如支付宝、微信等。 策略模式可以解决在多种算法相似的情况下,避免使用if.else或switch…case带来的复杂性和臃肿性。

Java是世界上最好的语言 6871

策略模式和C++多态

策略模式和C++多态 策略模式: 设计模式。一种在运行时更改算法行为的方式。 多态: 语言机制。通过基类的指针或者引用,在运行时动态调用实际绑定对象函数的行为。 多态是设计模式的基础,多态是框架的基础。 C++ 中实现策略模式的两种方法: 多态 // An highlighted block var foo = 'bar'; 类模板 ...

笔记 355

使用策略模式和多态去掉switch

为了更好的扩展性,可以“使用策略模式和多态去掉switch”(业务逻辑层适用,界面表现层除外,会增加代码的复杂度)。 “使用策略模式和多态去掉switch”的思想如下: 多处使用相同switch时(我觉得这个是前提,如果只有一处使用switch,而且后面基本上不会再扩展,那简单封装一下就可以了,毕竟时间那么宝贵,为啥还多去折腾一下呢?), 1、先将switch代码块封装到一个新clas...

让学习编程变得生动有趣~ 3150

孪生兄弟状态模式与策略模式有什么区别,究竟该如何选择

都说状态模式和策略模式很像,它们的 UML 类图一样。这也说明,单纯从代码角度来讲,它们的本质一样,其实都是多态的应用。但它们实际所代表的的事物特征是有本质区别的,选择哪个设计模式,代表了你看待业务场景的角度。从合理角度地对业务进程抽象,选择恰当的设计模式,才能让代码有更好的结构。 这篇文章重点说说我对状态模式和策略模式区别的理解,以及如何选择。 一、策略模式 关于策略模式,我之前写过一篇笔记,不...

weixin_30663471的博客 474

学习总结与分享-MySQL的优化(完结篇)

在日常代码开发中,我们总是要写各种各样的sql语句,一段程序或者说一次客户端与服务端的交互,最能影响执行速度的就是网络的传输和底层数据的存取等。。那么底层数据的存取如果是使用的是磁盘存储的关系型数据库,那么就是依靠sql语句了,所以,一个或者一组sql的执行效率,直接的影响到了程序的执行速度和用户体验,所以我们在编程时,要学会sql的优化,最大化的优化sql的执行时间,这样不仅可以增加执行速度,还...

VolcanoWec的博客 817
上一篇: 学习总结与分享-对象拷贝与序列化理论与使用
下一篇: 学习总结与分享-ClassLoader类加载器与类加载机制
VolcanoWec
博客等级 码龄8年 0粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值