首页 > 代码库 > Java设计模式(九)责任链模式 命令模式

Java设计模式(九)责任链模式 命令模式

(十七)责任链模式

责任链模式的目的是通过给予多个对象处理请求的机会,已解除请求发送者与接受者之间的耦合关系。面对对象的开发力求对象之前保持松散耦合,确保对象各自的责任最小化,这样的设计可以使得系统更加容易修改,同时降低产生缺陷的风险。

public class ChainTest {
	public static void main(String[] args) {
		String pass1="123456";
		String pass2="123456";
		String personId="123456789012345678";
		String email="fanyun7654@163.com";
		register(pass1,pass2,personId,email);
	}
	public static void register(String pass1,String pass2,String personId,String email){
		Filter f1 = new PasswordFilter1();
		Filter f2 = new PasswordFilter2();
		Filter f3 = new PersonIdFilter();
		Filter f4 = new EmailFilter();
		f1.setNext(f2);
		f2.setNext(f3);
		f3.setNext(f4);
		System.out.println(f1.doFilter(pass1,pass2,personId,email));
	}
}
abstract class Filter{
	Filter next = null;
	public Filter getNext() {
		return next;
	}
	public void setNext(Filter next) {
		this.next = next;
	}
	public String doFilter(String pass1,String pass2,String personId,String email){
		if (next == null) 
			return "成功";
		else 
			return next.doFilter(pass1,pass2,personId,email);
	}
}
class PasswordFilter1 extends Filter{
	public String doFilter(String pass1,String pass2,String personId,String email){
		if (!(pass1.equals(pass2)))
			return "两次密码输入不一致";
		else 
			return super.doFilter(pass1,pass2,personId,email);
	}
}
class PasswordFilter2 extends Filter{
	public String doFilter(String pass1,String pass2,String personId,String email){
		if (pass1.length()!=6)
			return "密码长度必须为6";
		else 
			return super.doFilter(pass1,pass2,personId,email);
	}
}
class PersonIdFilter extends Filter{
	public String doFilter(String pass1,String pass2,String personId,String email){
		if (personId.length()!=15 && personId.length()!=18)
			return "身份证号码非法";
		else 
			return super.doFilter(pass1,pass2,personId,email);
	}
}
class EmailFilter extends Filter{
	public String doFilter(String pass1,String pass2,String personId,String email){
		int i1=email.indexOf("@");
		int i2=email.indexOf(".");
		if (i1==-1 || i2==-1 || i2-i1<=1 || i1==0 || i2==email.length()-1)
			return "email非法";
		else 
			return super.doFilter(pass1,pass2,personId,email);
	}
} 
例子可能有点复杂,这是一个树状的例子,当然也可以是环状,环就是用同一个方法循环处理。上面的例子处理登录比起一串if else 可能多此一举了。但是在每个流程都很复杂的时候可以考虑使用。简化对象链和客户端代码是职责链主要的优点。

(十八)命令模式 command 

命令模式将请求封装在一个对象中,可以像管理对象一样去管理方法,传递并在合适的时机调用。

命令模式允许在服务执行的上下文使用客户端代码,所以除了控制方法的执行时间和上下文之外,命令模式还提供了一个钩子机制,允许客户代码作为算法的一部分。

interface Command{
	public void exe();
}
class Receiver{
	public void action(){
		System.out.println("command action");
	}
}
class Invoker{
	private Command command;
	public Invoker(Command command){
		this.command = command;
	}
	public void action(){
		command.exe();
	}
}
class MyCommand implements Command{
	private Receiver rec;
	public MyCommand(Receiver r){
		this.rec = r;
	}
	public void exe(){
		rec.action();
	}
}
public class CommandTest {
	public static void main(String[] args){
		Receiver r = new Receiver();
		Command cmd = new MyCommand(r);
		Invoker in = new Invoker(cmd);
		in.action();
	}
}
命令模式的目的就是达到命令的发出者跟执行者解耦,实现请求和执行分开。