0 0

关于一个方法三个功能用的问题0

       各位大神,最近看到很多纠结的代码,如下:

       如果有一个方法M,M很庞大,功能很复杂,开始只有一个模块A在用,过一段时间又做一个模块B也要用M这个方法,过一时间又做C也用M方法。但是A、B、C三个功能,不能直接用M方法,都需要进行一些个性化的定制开发。这样三个功能 完以后,M变得方法很难看明白(很恶心)。

        我想不明白,针对以上的情况正确做法是什么?

        1、针对A、B、C分别写三个M1、M2、M3?这样的优点:(1)可读性好 (2)如果功能变了只修改对应的方法就可以了。缺点:如果三方法共用的代码变了,会改三个方法。如果有漏改的对应的功能就不对。

        2、三个功能用一个M方法。优点:如果修改了共用的代码,只改一处就可以了。缺点:(1)可读性不好 (2)但是如果修改错了,三个功能都不能用。

 

        怎么办?????各位大神有什么好的建议。

 

2014年11月05日 17:56

3个答案 按时间排序 按投票排序

0 0

我怎么看到了简单工厂,工厂方法,以及未出现的抽象工厂模式

2014年11月18日 10:05
0 0

包装模式也可用在此场景,楼上说的策略模式有异曲同工之妙

public class M {

public void m() {

System.out.println("I am mmmmmmmmmmmmmm");
};

interface P {
public void pm();
}

static class Ad implements P {

private M m;

public Ad(M m) {
this.m = m;
}

@Override
public void pm() {

System.out.println("PPPPPPPpp");

m.m();
}
}

static class Ad1 implements P {

private M m;

public Ad1(M m) {
this.m = m;
}

@Override
public void pm() {

System.out.println("PPPPPPPpp1111111111111111");

m.m();
}
}

public static void main(String[] args) {

M m = new M();

Ad ad = new Ad(m);

ad.pm();


Ad1 ad1 = new Ad1(m);

ad1.pm();
}
}

2014年11月06日 11:23
0 0

这是策略模式的典型应用场景啊。

前提:
1,M方法的主要计算逻辑,ABC都是相同的
2,M方法细节的计算逻辑,ABC有个性化需求

那么M方法主要计算逻辑写出来,调用细节计算逻辑的部分封装成算法类。
这些算法类继承同一个算法接口。
M方法所在的类提供设置算法类的接口。

那么ABC分别调用M方法之前,把需要的算法类的实例设置到M方法所在的类里面。
就能达到动态切换个性化算法的目的。

比如说,M方法提供这样的接口(伪代码)

class MClass{
setCalc1 (CalcClass c1)

setCalc2 (CalcClass c2)

void M()
{
   this.c1.run();
   this.c2.run();
}
}

c1,c2都是同一个接口CalcClass的子类。

A方法调用的时候

MClass mc = new MClass()
mc.setCalc1(new Calc1())
mc.setCalc2(new Calc2())

mc.M()
}

2014年11月06日 10:24

相关推荐

    浅析一个表单多个Submit按钮的简单实现方法.pdf

    本文主要讨论了在Web开发中一个常见的问题:如何实现一个表单中多个Submit按钮的功能。文章首先介绍了一个表单单个Submit按钮的实现方法,然后深入讨论了一个表单多个Submit按钮的实现方法,提出了三种简单而常用的...

    Java 实验 用接口实现求三角形,圆形,矩形的面积和周长

    要求:①定义一个接口,其中包含一个计算面积的抽象方法和一个计算周长的抽象方法;②输入数据为圆的半径、三角形的三条边长、矩形的长和宽,对于用户的输入要有友好提示;③程序能够排除输入过程中的非法数据(如:...

    c#编写一元二次方程类实现求解

    2、 编写一个一元二次方程类(Equation),具有类型为double的三个私有字段a, b, c分别代表方程的三个系数,通过构造方法给三个系数设置值,并用getFirstRoot()方法和getSecondRoot()方法得到两个实根。请另编写一个...

    电脑搜索功能不能用的解决方法.docx

    标题中的“电脑搜索功能不能用的解决方法”指的是在计算机操作系统中遇到搜索功能失效的问题,描述进一步明确了这一问题,即搜索功能无法正常使用,可能会显示错误信息,并且搜索助手工具栏为空白。这个问题可能是...

    软件测试作业三角形判定

    在这个实验中,我们将使用面向对象的编程语言,如Java或C++,设计一个窗口,接收三个变量,然后判断这三条边是否构成三角形,若是,是什么样的三角形,并输出结果。 程序功能流程图: 1. 输入三个变量 2. 判断这...

    iphone之使用讯飞sdk写的一个语音识别功能

    总的来说,"iphone之使用讯飞sdk写的一个语音识别功能"涵盖了iOS应用开发中的UI设计、第三方SDK集成、音频处理、事件响应等多方面技能。通过实践这个项目,开发者不仅可以掌握讯飞语音识别SDK的使用,还能提升自己的...

    android ExpandableListView三级菜单的使用

    在这个“android ExpandableListView三级菜单的使用”示例中,我们将深入探讨如何创建并操作一个支持三级菜单的`ExpandableListView`。 首先,`ExpandableListView`是`ListView`的扩展,它提供了更丰富的功能,可以...

    三维装箱问题的MATLAB可视化仿真最后输出三维装箱效果,matlab2021a测试。仿真速度较慢。

    在该问题中,目标是找到一个最佳方式将不同尺寸的物体放入一个三维空间(箱子)内,使得空间利用率最高,同时保持物体间不相交。MATLAB是一种强大的数学计算和可视化软件,常用于解决各种复杂问题,包括三维装箱问题...

    如何解决xp系统的电脑搜索功能不能用的问题

    当这个功能出现故障,无法正常使用时,可能会对用户的日常操作带来不便。以下是一些解决Windows XP系统搜索功能失效的方法: 1. **第一种方法:注册jscript.dll** 当搜索功能无法工作时,可能是系统中的jscript....

    一种计算单回路三点和四点函数的新颖方法。 三, 红外发散盒

    摘要本文是该系列的第三篇也是最后一篇,提出了一种用于计算单环标量积分的替代方法。 它将前两篇文章的结果扩展到红外发散... 当考虑使用广义一环积分作为构建块的一环以外应用此方法时,此最后一个功能可能会很有用。

    拖动div到另一个div中

    标题“拖动div到另一个div中”描述的就是这样一个功能,即实现一个div元素能够被拖动并放置到另一个div内,同时显示被拖动div的ID。这个功能在各种应用场景中都很有用,如文件管理器、布局构建器或富文本编辑器等。 ...

    MATLAB三次样条插值之三弯矩法.docx

    MATLAB 三次样条插值之三弯矩法是基于三个节点的样条插值方法,使用追赶法来求解三次样条分段函数系数因子。该方法可以实现通用格式解题,并且可以调用追赶法程序来计算插值函数的值。 首先,通过函数 sanwanj 得到...

    三点画圆弧

    "三点画圆弧"就是这样一个技术,它基于平面几何中的基本原理,通过给定的三个点可以确定一个唯一的圆。这个功能在地图软件、工程设计软件以及游戏开发中都有广泛应用。 首先,我们需要理解如何从三个点确定一个圆。...

    Android自定义Camera实现拍照功能

    要实现拍照功能,我们需要在CameraSurfaceView类中添加一个takePicture方法,该方法将调用Camera的takePicture方法来拍摄照片。同时,我们还需要提供三个回调函数:ShutterCallback、RawPictureCallback和...

    一个RESTful的文件下载方法

    本文将深入探讨一个具体的RESTful文件下载方法,并详细分析其实现原理。 #### 二、方法描述 根据提供的代码片段,我们可以看到这是一个基于Java的RESTful服务端点,用于处理文件下载请求。该方法定义在一个类中,...

    flutter全局悬浮按钮方法及代码.docx

    今天,我们将探讨如何在 Flutter 中实现全局悬浮按钮,并提供三个不同的实现方法。 方法一:使用 Scaffold 和 Stack 实现悬浮按钮 在这个方法中,我们使用 Scaffold 和 Stack 小部件来实现悬浮按钮。我们首先定义...

    一个 Matlab gui 绘制三维曲面图小程序

    例如,你可以先用`meshgrid`函数生成x和y的网格,然后通过一个数学函数或数据文件得到z值。在GUI中,用户可能在输入框中输入函数表达式或者加载数据文件,程序根据这些输入生成三维图像。 为了实现这一功能,你需要...

    Windows7怎么配置蓝牙模块GAIA功能的方法.docx

    - 将这三个配置项设置为“Enabled”,以确保GAIA功能被正确激活。 4. **添加必要的库文件** - 在配置完上述功能后,还需要在工程中添加必要的库文件。在“Libraries”部分添加“gaia_spp”库文件。 - 这一步非常...

    asp.net前台调用后台方法传参数

    - `public string ButtShow(string strs)`:定义了一个公共方法`ButtShow`,接受一个字符串参数`strs`并返回原字符串。 **原理**: - 在这个例子中,`ButtShow`方法被直接嵌入到了HTML中,当页面加载时,ASP.NET...

    WPF三维立体动画(一个WPF项目,利用viewport3D呈现)

    `BeginAnimation` 方法用于启动动画,它接受一个依赖项属性和一个 `AnimationTimeline` 对象。 创建3D动画的一般步骤如下: 1. **定义3D模型**:使用 `MeshGeometry3D` 或其他3D几何类创建基本形状,然后添加到 `...

Global site tag (gtag.js) - Google Analytics