zoukankan      html  css  js  c++  java
  • Java设计模式(九)责任链模式 命令模式

    (十七)责任链模式

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

    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 "两次password输入不一致";
    		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 "password长度必须为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 可能多此一举了。可是在每一个流程都非常复杂的时候能够考虑使用。简化对象链和client代码是职责链基本的长处。

    (十八)命令模式 command 

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

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

    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();
    	}
    }
    命令模式的目的就是达到命令的发出者跟运行者解耦,实现请求和运行分开。


  • 相关阅读:
    Java实现第十届蓝桥杯组队
    Java实现第十届蓝桥杯组队
    Java实现第十届蓝桥杯组队
    Java实现第十届蓝桥杯组队
    Java实现第十届蓝桥杯组队
    程序员加班奇遇
    Spring Boot导出jar包发布
    Eclipse工具栏太多,自定义工具栏,去掉调试
    ${pageContext.request.contextPath}的解释以及和request.contextPath的区别
    request 获取各种路径
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6820331.html
Copyright © 2011-2022 走看看