重构之4.Replace Type Code with State/Strategy(以State/Strategy取代类型码)

场景:

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

,可以使用状态对象取代类型码

类图:

修改前:

Student

/**
 * @file Student.java
 *
 *
 * @author wumingkun
 * @version 1.0.0
 * @Description
 */

package com.demo.refactor.state.before;

/**
 * @author wumingkun
 *
 */
public class Student {
	private int id;
	private String name;
	private int type;
	public static final int A =1;
	public static final int B =2;

	public Student(int id, String name, int type) {
		super();
		this.id = id;
		this.name = name;
		this.type = type;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getType() {
		return type;
	}
	public void setType(int type) {
		this.type = type;
	}
}

修改后:

Student

/**
 * @file Student.java
 *
 *
 * @author wumingkun
 * @version 1.0.0
 * @Description
 */

package com.demo.refactor.state.after;

/**
 * @author wumingkun
 *
 */
public abstract class Student {
	private int id;
	private String name;
	public static final int A =1;
	public static final int B =2;
	private StudentType type ;
	public Student(int id, String name,StudentType type) {
		super();
		this.id = id;
		this.name = name;
		this.type=type;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getType() {
		return type.getType();
	}

	public void setType(int type) {
		//调用工厂方法
		this.type = StudentType.create(type);
	}

}

StudentType

package com.demo.refactor.state.after;

public abstract class StudentType {
	public abstract int getType();
	public static StudentType create(int type){
		switch (type) {
		case Student.A:
			return new TypeA();
		case Student.B:
			return new TypeB();
		default:
			throw new IllegalArgumentException();
		}
	}
}

TypeA

/**
 *
 * @author wumingkun
 * @version 1.0.0
 * @Description
 */

package com.demo.refactor.state.after;

/**
 * @author wumingkun
 *
 */
public class TypeA extends StudentType {

	/* (non-Javadoc)
	 * @see com.refractor.subcode.after.StudentManagement#getType()
	 */
	@Override
	public int getType() {
		return Student.A;
	}

	@Override
	public String toString() {
		return "TypeA [type=" + getType() + "]";
	}

}

TypeB

</pre><pre name="code" class="java">/**
 *
 * @author wumingkun
 * @version 1.0.0
 * @Description
 */

package com.demo.refactor.state.after;

/**
 * @author wumingkun
 *
 */
public class TypeB extends StudentType {

	/* (non-Javadoc)
	 * @see com.refractor.subcode.after.StudentManagement#getType()
	 */
	@Override
	public int getType() {
		return Student.B;
	}

	@Override
	public String toString() {
		return "TypeB [type=" + getType() + "]";
	}

}
时间: 2024-11-09 03:39:30

重构之4.Replace Type Code with State/Strategy(以State/Strategy取代类型码)的相关文章

重构之3.Replace Type Code with Subclasses(以子类取代类型码)

场景: 通常我们会在业务层判断类型码,执行不同的方法,可以使用子类来取代类型码 前提: 1.类型码不会被改变 2.类型码所属的类没有子类 修改前: Student: /** * @file Student.java * * * @author wumingkun * @version 1.0.0 * @Description */ package com.refractor.subcode.before; /** * @author wumingkun * */ public class Stu

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

场景 在一个类中我们经常会下定义一些类型码,如: public static final int INVALID=0; public static final int VALID=1; 我们可以将这些数值转换为一个类 前提条件: 只有当类型码是纯粹数据时(类型码不会在Switch语句中引起行为的变化时),你才能以类来取代它 修改前代码: Student package com.demo.refactor.codetype.before; public class Student { privat

关于Strategy和State设计模式

之前,我在描述我所采用的设计模式时,一直在Strategy和State之间犹豫,略微有些拿捏不准,说哪种设计模式好.结果到最后,会根据自己所想,觉得是State就是State,觉得Strategy就是Strategy,不过,说的时候,还是会带有些犹豫.最近看Martin Fowler的<重构,改善既有代码的设计>一书,上面说到: At this stage the choice of pattern (and name) reflects how you want to think about

[Functional Programming] Transition State based on Existing State using the State ADT (liftState, composeK)

While sometimes outside input can have influence on how a given stateful transaction transitions, there are many times where the current state at the time of a transaction. We can see the power of this type of transaction by seeing what it would take

[Functional Programming ADT] Initialize Redux Application State Using The State ADT

Not only will we need to give our initial state to a Redux store, we will also need to be able to reset our state at any time by dispatching an action. We can get the best of both worlds by having a function that will return an object with all of our

saltstack &nbsp; state.sls 与 state.highstate

这里简单介绍一下state.sls 与 state.highstate 与区别,这也是自己在使用过程中的一点心得吧. 环境介绍:salt 2015.5.0 (Lithium) top.sls state.highstate 这个是全局的所有的环境的所有的状态生效: state.sls 用来指定特定sls进行处理. 当使用  salt '*' state.highstate 没有任何问题 可是当执行 salt '*' state.sls servers_packages 发现没法执行 翻看官方文档

设计模式之策略模式和状态模式(strategy pattern &amp; state pattern)

本文来讲解一下两个结构比较相似的行为设计模式:策略模式和状态模式.两者单独的理解和学习都是比较直观简单的,但是实际使用的时候却并不好实践,算是易学难用的设计模式吧.这也是把两者放在一起介绍的原因,经过对比和实例介绍,相信应该会一些比较深刻的感知.最后在结合个人的体会简单聊一下对这两个模式的一些看法. 1. 模式概念 1.1 策略模式 运行时更改类的行为或算法,从而达到修改其功能的目的: 使用场景: 一个系统需要动态地在几种算法中选择一种,而这些算法之间仅仅是他们的行为不同. 此外决策过程中过多的

重构改善既有代码设计--重构手法08:Replace Method with Method Object (以函数对象取代函数)

你有一个大型函数,其中对局部变量的使用,使你无法釆用 Extract Method. 将这个函数放进一个单独对象中,如此一来局部变量就成了对象内的值域(field) 然后你可以在同一个对象中将这个大型函数分解为数个小型函数. class Order... double price() { double primaryBasePrice; double secondaryBasePrice; double tertiaryBasePrice; // long computation; ... }

[jvm解析系列][八]方法表集合,Code属性和Exceptions属性,你的字节码存在哪里了?

根据我们第五章的总构图来看,这一章我们正该讲到方法表集合: 大家可能注意到在java中声明一个方法和声明一个变量很相似,public int a = 0;和public int a(){};于是在方法表集合中和字段表集合也很相似. 一个方法表的结构应当和下图一样: 对比字段表应该发现几乎是一样的.access_flags里的可选项略有不同而已. access_flags: 这样以来我们把方法表和字段表对比来看应该很好理解了.对于属性表又是一大块内容.上次我们说到了属性表的结构 并且说了在字段表中