Replace Type Code with State/Strategy(以State/Strategy取代类型码)

有一个类型码,它会影响类的行为,但你无法通过继承消除它

 

public class Employee {static final int ENGINNER = 0;static final int SALESMAN = 1;static final int MANAGER = 2;private int type;// 月薪.private int montylySalary;// 佣金.private int commission;// 奖金.private int bonus;public Employee(int type) {this.type = type;}public int payAmount() {switch(getType()) {case ENGINNER: return montylySalary;case SALESMAN: return montylySalary + commission;case MANAGER: return montylySalary + bonus;default:throw new IllegalArgumentException("Incorrect Employee.");}}public int getType() {return type;}
}

重构:以状态对象取代类型码

public abstract class EmpoyeeType {static final int ENGINNER = 0;static final int SALESMAN = 1;static final int MANAGER = 2;public abstract int getTypeCode();public static EmpoyeeType newType(int code) {switch (code) {case ENGINNER: return new Engineer();case SALESMAN: return new Salesman();case MANAGER: return new Manager();default:throw new IllegalArgumentException("Incorrect Employee Code.");}}
}public class Engineer extends EmpoyeeType {public int getTypeCode() {return Employee.ENGINNER;}
}public class Manager extends EmpoyeeType {public int getTypeCode() {return Employee.MANAGER;}
}public class Salesman extends EmpoyeeType {public int getTypeCode() {return Employee.SALESMAN;}
}public class Employee {private EmpoyeeType type;// 月薪.private int montylySalary;// 佣金.private int commission;// 奖金.private int bonus;public Employee(int type) {this.type = type;}public int payAmount() {switch(getType()) {case EmpoyeeType.ENGINNER: return montylySalary;case EmpoyeeType.SALESMAN: return montylySalary + commission;case EmpoyeeType.MANAGER: return montylySalary + bonus;default:throw new RuntimeException("Incorrect Employee.");}}public EmpoyeeType getType() {return type;}
}

再继续Replace Conditional with Polymorphism(以多态取代条件表达式)

public abstract class EmpoyeeType {static final int ENGINNER = 0;static final int SALESMAN = 1;static final int MANAGER = 2;public abstract int getTypeCode();public abstract int payAmount(Employee employee);public static EmpoyeeType newType(int code) {switch (code) {case ENGINNER: return new Engineer();case SALESMAN: return new Salesman();case MANAGER: return new Manager();default:throw new IllegalArgumentException("Incorrect Employee Code.");}}
}public class Engineer extends EmpoyeeType {public int getTypeCode() {return Employee.ENGINNER;}public int payAmount(Employee employee) {return employee.getMontylySalary();}
}public class Manager extends EmpoyeeType {public int getTypeCode() {return Employee.MANAGER;}public int payAmount(Employee employee) {return employee.getMontylySalary() + employee.getBonus();}
}public class Salesman extends EmpoyeeType {public int getTypeCode() {return Employee.SALESMAN;}public int payAmount(Employee employee) {return employee.getMontylySalary() + employee.getCommission();}
}public class Employee {private EmpoyeeType type;// 月薪.private int montylySalary;// 佣金.private int commission;// 奖金.private int bonus;public Employee(int type) {this.type = type;}public int payAmount() {return getType().payAmount(this);}public EmpoyeeType getType() {return type;}
}

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

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

相关文章

MSRA副院长周明博士:四大研究领域揭示自然语言技术的奥秘

来源:AI科技评论概要:自然语言理解处在认知智能最核心的地位。比尔盖茨曾说过,「语言理解是人工智能皇冠上的明珠」,沈向洋博士也说过「懂语言者得天下」。自然语言理解处在认知智能最核心的地位。它的进步会引导知识图谱的进步&a…

ajax将响应结果显示到iframe,JavaScript:iframe / Ajax / JSON

iframe在Ajax流行之前大量使用:iframe中的src属性指定的就是一个独立的页面url地址,iframe中呈现的就是这个页面的内容。通过改变src的值,我们就可以轻松的改变iframe中的内容(类似的,刷新验证码也是同样的手段):docum…

2018 AI 产品趋势:喧嚣的追风者和静默的收割人

来源:36氪毫无疑问,在消费科技品领域,AI产品有泡沫。故事要从2014年说起。那一年底,亚马逊低调发布了智能音箱Echo,苹果发布了第一代Apple Watch智能手表。比起AI浪潮,那个时候大家谈论更多,是智…

ftp服务器需要什么系统,ftp服务器需要什么系统

ftp服务器需要什么系统 内容精选换一换单独购买的云硬盘为数据盘,可以在云硬盘列表中看到磁盘属性为“数据盘”,磁盘状态为“可用”。此时需要将该数据盘挂载给云服务器使用。系统盘必须随云服务器一同购买,并且会自动挂载,可以在…

重磅 | MIT启动IQ计划:研究人类智能,让全世界的机构共同合作

作者:思颖概要:当地时间 2 月 1 日,MIT 宣布启动 MIT Intelligence Quest(智能探索)计划,该项计划旨在助力人类智能的基础研究,推动能造福于社会的技术工具的发展。据悉,该项声明由 …

北京发自动驾驶车辆考试大纲 难度堪比普通人考驾照

来源:新京报概要:自《加快推进自动驾驶车辆道路测试有关工作的指导意见》发布以来,北京进一步为自动驾驶车辆明确其性能测试与实际道路测试的“考试大纲”。自《加快推进自动驾驶车辆道路测试有关工作的指导意见》发布以来,北京进…

免费 Flash 留言板 -Powered by Kong

-----点击预览------新开窗口地址:http://iamkong.com/bord/bord.html重点*在FLASH load数据库数据,以及留言Post数据库这是FLASH与外面数据交互的方法之一 >点击下载{white白色}>点击下载{black 黑色}点击下载FLA源文件转载于:https://www.cnblog…

普华永道2030汽车产业报告 私家车真正Out了!

来源:智东西概要:随着新兴科技渗透汽车产业,电动化、智能化、共享化等趋势愈演愈烈。随着新兴科技渗透汽车产业,电动化、智能化、共享化等趋势愈演愈烈。科技企业、新造车企业杀入传统价值链,业界称之为汽车产业变革。…

[转] TOUGH 的系列平面广告

转载于:https://www.cnblogs.com/temptation/archive/2006/08/09/471863.html

未来网络经济的99个趋势报告

来源: 199IT互联网数据中心概要:未来网络经济的99个趋势报告72%的全球CEO认为未来3年将比过去50年对其行业的影响更大;到2020年,平均每个人都会比与机器人有更多的对话;创新品牌的品牌价值升值比没有那么创新的品牌高9…

Hinton:人类就是机器,绝妙的机器

编译 夏乙 唐旭量子位 出品 | 公众号 QbitAI概要:三十多年以来,Geoffrey Hinton一直徘徊在人工智能研究的边缘地带。1三十多年以来,Geoffrey Hinton一直徘徊在人工智能研究的边缘地带。他像一个局外人一样坚守着一个简单的观点:计…

装修相片(第50天拍,全部,25号更新)

装修相片(第50天拍,全部,25号更新) 好不容易,找了个时间和相机,去把房子照了下来,因为准备要搬家了,怕搬家后乱乱的,没有了效果.1.厨房:厨柜700元/米,方太抽油烟机11902.客卧:3.主卧,富得宝,整套3480元.5.书房,书架(双虎),2300元.6.餐厅:7.沙发:3700元,这个一直觉得贵了.8.电视…

不止Alexa和AWS,揭秘亚马逊人工智能发展史

来源:腾讯科技编译:昱烨亚马逊上周四公布了2017年第四季度财报,盈利接近20亿美元,创下历史纪录。Alexa语音助手和AWS云计算服务是亚马逊业绩的亮点。《连线》杂志近日刊文,介绍了深度学习技术如何赋能Alexa和AWS&#…

Separate Query from Modifier(分离查询和修改)

某个函数既返回对象状态值,又修改对象状态 重构:建立两个不同的函数,其中一个负责查询,另一个负责修改 动机 如果某个函数只是向你提供一个值,没有任何看得到的副作用,那么这是个很有价值的东西。 你可以任…

python实现地牢迷宫生成

python实现地牢迷宫生成基本属性生成房间生成墙壁生成门口生成通道基本属性 定义当前地牢的等级,地图长宽,房间数量,房间的最小最大长度,如下 class Map:def __init__(self):self.width 30self.heigh 30self.level 1self.roo…

Parameterize Method(令函数携带参数)

若干函数做了类似的工作,但在函数体中却包含了不同的值 重构:建立单一函数,以参数表达那些不同的值。

「谷歌大脑」提出通过对长序列进行摘要提取,AI可自动生成「维基百科」

原文来源:arXiv作者:Peter J. Liu、Mohammad Saleh、Etienne Pot、Ben Goodrich、Ryan Sepassi、Łukasz Kaiser、Noam Shazeer「雷克世界」编译:嗯~阿童木呀最近,经过研究证明,生成英文维基百科(English W…

redis基本用法学习(C#调用CSRedisCore操作redis)

除了NRedisStack包,csredis也是常用的redis操作模块(从EasyCaching提供的常用redis操作包来看,CSRedis、freeredis、StackExchange.Redis应该都属于常用redis操作模块),本文学习使用C#调用CSRedis包操作redis的基本方式…

简明Python教程学习笔记_3_模块

模块 如果你想要在其他程序中重用很多函数,那么你该如何编写程序呢?你可能已经猜到了,答案是使用模块。模块基本上就是一个包含了所有你定义的函数和变量的文件。为了在其他程序中重用模块,模块的文件名必须以.py为扩展名。 pyt…

python: 使用socket实现局域网不同主机通信。解决ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。

目录1 socket的使用1.1 TCP方法1.2 UDP方法2 局域网内连接2.1总结1 socket的使用 1.1 TCP方法 在socket中使用socket.socket建立会话,如果是服务器,需要绑定服务器地址和端口号,然后进行循环监听,当有客户端连接时再接收数据。 …