State模式的定义: 不同的状态,不同的行为;或者说,每个状态有着相应的行为.
何时使用 :State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了.
通常的模式下我们需要根据状态来来判断动作都是使用一连串的 if...else 语句,例如:
enum
PaperColor
{
WHITE,BLACK,BLUE,RED
}

class
MyPaper
{
PaperColor paperColor;

public MyPaper(PaperColor color){
this.paperColor=color;
}

public PaperColor getMyPaperColor(){
return this.paperColor;
}
}

public
class
MainClass
{
public static void main(String[] args)
{
MyPaper myPaper = new MyPaper(PaperColor.WHITE);

if(myPaper.getMyPaperColor()==PaperColor.WHITE){
System.out.println("You need a black pen");
}else if(myPaper.getMyPaperColor()==PaperColor.BLACK){
System.out.println("You need a white pen");
}else if(myPaper.getMyPaperColor()==PaperColor.BLUE){
System.out.println("You need a red pen");
}else if(myPaper.getMyPaperColor()==PaperColor.RED){
System.out.println("You need a blue pen");
}
}
}
运行结果:
You need a black pen
白色的纸张需要黑色的笔,黑色的纸张需要白色的笔,蓝色的纸张需要红色的笔,红色的纸张需要蓝色的笔.....
由上面程序看来,只要有多少种纸就需要多少个 else if 如果以后存在别的颜色的纸就必须在枚举里面加类型同时继续的添加 else if 然后再重新编译,显然这样的代码对日后扩展非常不利.这样的问题我们可以用State模式得到解决.
interface
PaperColor
{
public void getPenColor();
}

class
White
implements
PaperColor
{
public void getPenColor(){
System.out.print("You need a black pen");
}
}

class
Black
implements
PaperColor
{
public void getPenColor(){
System.out.print("You need a white pen");
}
}

class
Blue
implements
PaperColor
{
public void getPenColor(){
System.out.print("You need a red pen");
}
}

class
Red
implements
PaperColor
{
public void getPenColor(){
System.out.print("You need a blue pen");
}
}

class
MyPaper
{
PaperColor paperColor;

public MyPaper(PaperColor color){
this.paperColor=color;
}

public PaperColor getMyPaperColor(){
return this.paperColor;
}

public void choicePen(){
this.paperColor.getPenColor();
}
}

public
class
MainClass
{
public static void main(String[] args)
{
PaperColor color = new Blue();
MyPaper myPaper = new MyPaper(color);
myPaper.choicePen();
}
}
运行结果:
You need a red pen
State模式不但使得程序容易扩展同时也消除了烦琐的if...else语句.
何时使用 :State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了.
通常的模式下我们需要根据状态来来判断动作都是使用一连串的 if...else 语句,例如:
enum
PaperColor
{
WHITE,BLACK,BLUE,RED
}

class
MyPaper
{
PaperColor paperColor;
public MyPaper(PaperColor color){
this.paperColor=color;
}
public PaperColor getMyPaperColor(){
return this.paperColor;
}
}

public
class
MainClass
{
public static void main(String[] args)
{
MyPaper myPaper = new MyPaper(PaperColor.WHITE);
if(myPaper.getMyPaperColor()==PaperColor.WHITE){
System.out.println("You need a black pen");
}else if(myPaper.getMyPaperColor()==PaperColor.BLACK){
System.out.println("You need a white pen");
}else if(myPaper.getMyPaperColor()==PaperColor.BLUE){
System.out.println("You need a red pen");
}else if(myPaper.getMyPaperColor()==PaperColor.RED){
System.out.println("You need a blue pen");
}
}
}
运行结果:
You need a black pen
白色的纸张需要黑色的笔,黑色的纸张需要白色的笔,蓝色的纸张需要红色的笔,红色的纸张需要蓝色的笔.....
由上面程序看来,只要有多少种纸就需要多少个 else if 如果以后存在别的颜色的纸就必须在枚举里面加类型同时继续的添加 else if 然后再重新编译,显然这样的代码对日后扩展非常不利.这样的问题我们可以用State模式得到解决.
interface
PaperColor
{
public void getPenColor();
}

class
White
implements
PaperColor
{
public void getPenColor(){
System.out.print("You need a black pen");
}
}

class
Black
implements
PaperColor
{
public void getPenColor(){
System.out.print("You need a white pen");
}
}

class
Blue
implements
PaperColor
{
public void getPenColor(){
System.out.print("You need a red pen");
}
}

class
Red
implements
PaperColor
{
public void getPenColor(){
System.out.print("You need a blue pen");
}
}

class
MyPaper
{
PaperColor paperColor;
public MyPaper(PaperColor color){
this.paperColor=color;
}
public PaperColor getMyPaperColor(){
return this.paperColor;
}
public void choicePen(){
this.paperColor.getPenColor();
}
}

public
class
MainClass
{
public static void main(String[] args)
{
PaperColor color = new Blue();
MyPaper myPaper = new MyPaper(color);
myPaper.choicePen();
}
}
运行结果:
You need a red pen
State模式不但使得程序容易扩展同时也消除了烦琐的if...else语句.
本文介绍State模式的概念及其在状态切换场景的应用。通过一个简单的例子对比了使用if...else语句和State模式实现状态切换的不同方式,展示了State模式如何提高代码的可扩展性和可维护性。

6980

被折叠的 条评论
为什么被折叠?



