我的java设计模式 总结【15】状态模式 State & 解释器 Intepreter

State 状态模式

这个也不难,就是根据状态决定行为。简单来说,就是类里面的方法都要判断当前状态,才能知道该如何运行的时候,将这些需要判断状态的方法抽象出来根据不同的状态获取不同的实现来进行执行方法。
例举一个原始的方式:

public class Old {
	int state;
	public Old(int s) {
		state = s;
	}
	public void method1() {
		switch (state) {
		case 1:
			System.out.println("hello m11");
			break;
		case 2:
			System.out.println("hello m12");
			break;
		case 3:
			System.out.println("hello m13");
			break;
		}
	}
	public void method2() {
		switch (state) {
		case 1:
			System.out.println("hello m21");
			break;
		case 2:
			System.out.println("hello m22");
			break;
		case 3:
			System.out.println("hello m23");
			break;
		}
	}

	public void method3() {
		switch (state) {
		case 1:
			System.out.println("hello m31");
			break;
		case 2:
			System.out.println("hello m32");
			break;
		case 3:
			System.out.println("hello m33");
			break;
		}
	}
}

这个类只是简单的表达了一下问题。state的状态。和类中method1,method2,method3的switch 。
对于类似这种问题。就需要将state状态的判断进行解耦和拆分了。
根据state模式修改以后会是

abstract class M {
	abstract void method1();

	abstract void method2();

	abstract void method3();
}

class M1 extends M {
	@Override
	void method1() {
		System.out.println("hello m11");
	}
	@Override
	void method2() {
		System.out.println("hello m12");
	}
	@Override
	void method3() {
		System.out.println("hello m13");
	}
}
class M2 extends M {
	@Override
	void method1() {
		System.out.println("hello m21");
	}
	@Override
	void method2() {
		System.out.println("hello m22");
	}
	@Override
	void method3() {
		System.out.println("hello m23");
	}
}

class M3 extends M {
	@Override
	void method1() {
		System.out.println("hello m31");
	}
	@Override
	void method2() {
		System.out.println("hello m32");
	}
	@Override
	void method3() {
		System.out.println("hello m33");
	}
}

public class New {

	int state;

	public New(int s) {
		state = s;
	}

	public void dostate() {
		M m=null;
		switch (state) {
		case 1:
			m=new M1();
			break;
		case 2:
			m=new M2();
			break;
		case 3:
			m=new M3();
			break;
		}
		m.method1();
		m.method2();
		m.method3();
	}
}

对此来说。可以很明显了的知道了。不同M实现类只需要关注自己的本身实现就好了。也无需判断。而判断交给调用这来判断具体采用什么状态类型的实现类即可。

需要注意的是

从不同的维度来分析。

  • 当你的方法需要不断的进行扩展的时候是不适合用state模式的。比如上面的例子我需要增加一个method4的话所有子类都需要再重写一次method4,这样非常的不方便,反而适得其反。反之就是当method不会再扩展的时候可以考虑适用state模式。
  • 再者当你的state不会扩展,状态为固定的时候那不如就用switch来判断。省了写那么多的子类。比如上面的例子我就123三种状态,不会再出现其他状态的时候那么初始的那个例子是完全可以的。不需要写那么多的子类实现
  • 总之state就是适合用于方法不增加,但是状态会不断增加的那种案例,当其中一条都不满足的时候就需要多考虑。总之以实际为主。

解释器 Intepreter

解释器模式,其实类似于解释模式。类似是在一种语言上在做一种语言的解释器。比如用C开发的python解析器。用C开发的java解析器。等等。我从业以来没用过。只当知道一下而已。具体信息百度其他大神资料。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值