8.14 replace type code with subclasses (以子类取代类型码)

原创 2011年10月17日 10:38:23

有一个不可变的类型码,会影响类的行为。

以子类取代这个类型码。

动机:

如果类型码会影响宿主类的行为,那么最好的办法就是借助多态来处理变化行为。

以类型码的宿主类为基类,针对每种类型码建立相应的子类。

一下情况不能那么做:类型码值在对象创建之后发生了变化;由于某些原因,类型码宿主类已经有了子类。因此需要使用replace type code with state/strategy。

另一个原因是:宿主类中出现了“只与具备特定类型码之对象相关”的特性。可以使用push down method和push down field。

做法:

使用self encapsulate field将类型码自我封装起来。

=》如果类型码被传递给构造函数,就需要将构造函数换成工厂函数。

为类型码的每一个数值建立一个相应的子类。在每个子类中覆写类型码的取值函数,使其返回相应的类型码值。

=》这个值被硬编码return句中。这看起来很肮脏,但只是权宜之计。当所有case子句都被替换后,问题就解决了。

从超类中删除保存类型码的字段。将类型码访问函数声明为抽象函数。


旧代码

class Employee...
private int _type;
static final int ENGINEER = 0;
static final int SALESMAN = 1;
static final int MANAGER = 2;
Employee(int type){
    _type = type;
}



新代码

class Employee...
abstract int getType();
static employee create(int type){
    switch(type){
        case ENGINERR:
            return new Engineer();
        case SALESMAN:
            return new Salesman();
        case MANAGER:
            return new Manager();
        default:
            throw new IllegalArgumentException();
    }
    return new Employee(type);
}
private Employee(int type){
    _type = type;
}
class Engineer extends Employee{
    int getType(){
        return employee.ENGINEER;
    }
}




J2ME (Java 2 Micro Edition) 简介

■前言      如果您曾经到http://www.javasoft.com 网站上查询有关Java 2 Micro Edition 的资料,十之八九会被一大堆的技术名词搞的一头雾水。什么 KVM ,...
  • jiangtao
  • jiangtao
  • 2001-04-13 09:39:00
  • 3592

重新组织数据之十五 :Replace Type Code with State/Strategy(以State/strategy 取代型别码)

你有一个type code ,它会影响class 的行为,但你无法使用subclassing。 以state object (专门用来描述状态的对象)取代type code 。 动...
  • yuwei629
  • yuwei629
  • 2013-05-07 09:09:47
  • 692

重构之2.Replace Type Code with Class(以类取代类型码)

场景 在一个类中我们经常会下定义一些类型码,如: public static final int INVALID=0; public static final int VALID=...
  • wobendiankun
  • wobendiankun
  • 2014-09-10 23:13:08
  • 911

Replace Type Code with Subclasses(以子类取代型别码)

你有一个不可变得type code,它会影响类的行为。以一个子类取代这个type code。动机如果一个type code不会影响行为,你可以使用Replace Type Code with Clas...
  • bendan999999999
  • bendan999999999
  • 2009-02-09 09:04:00
  • 1331

replace type code with class(重构)用类替换类型码

在实际编程中,经常会遇到一些这样的问题:对于一类事物,经过会有一些不变的常量。例如:季节有春夏秋冬,方向有东西南北,状态有一二三四等等。通常的解决办法是使用类型码:也就是通常所说的类常量。   ...
  • langqiao123
  • langqiao123
  • 2013-08-14 09:35:51
  • 521

ReplaceTypeCodeWithClass(以类取代类型码)

#ifndef REPLACETYPECODEWITHCLASS_H_ #define REPLACETYPECODEWITHCLASS_H_ #include enum BloodType { ...
  • Tony_Wong
  • Tony_Wong
  • 2014-06-28 16:26:21
  • 370

Eclipse重构——Replace TypeCode with Class

《重构——改善既有代码》 Motivation ü  类型码不是类型安全的,终究只是一堆数字或者一个字符串。使用类代替类型码,可以做更好的编译检查。 ü  如果类型码不影响宿主类的行为,则优先考...
  • crylearner
  • crylearner
  • 2013-04-14 08:49:25
  • 1120

Replace Type Code with Class(以类取代型别码)

class 中有一个数值型别码,但它不影响class的行为以一个新的class替换该数值型别码。class Person ...public static final int O = 0;public...
  • bendan999999999
  • bendan999999999
  • 2009-02-06 09:24:00
  • 678

重构 -- Replace Subclass with Fields(以值域取代子类)

动机(Motivation) 修改这些函数,使它们返回superclass中的某个(新增值域,然后销毁subclasses) 示例 1 2 3 4 5 6 7...
  • netcaoniao
  • netcaoniao
  • 2014-05-28 15:38:13
  • 496

重构手法31:Replace Type Code with Subclass (以子类取代类型码)

重构手法31:Replace Type Code with Subclass (以子类取代类型码)   你有一个不可变的类型码,它会影响类的行为。以子类取代这个类型码。 动机...
  • fwch1982
  • fwch1982
  • 2012-06-12 11:46:42
  • 419
收藏助手
不良信息举报
您举报文章:8.14 replace type code with subclasses (以子类取代类型码)
举报原因:
原因补充:

(最多只允许输入30个字)