(十七)责任链模式
责任链模式的目的是通过给予多个对象处理请求的机会,已解除请求发送者与接受者之间的耦合关系。面对对象的开发力求对象之前保持松散耦合,确保对象各自的责任最小化,这样的设计可以使得系统更加容易修改,同时降低产生缺陷的风险。
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(); } }命令模式的目的就是达到命令的发出者跟执行者解耦,实现请求和执行分开。