zoukankan      html  css  js  c++  java
  • 适配器模式(对象适配器)

    java设计模式大体分为23种设计模式,直接通过例子学习设计模式,更易于理解和思考其中的原理和作用,以下给出 适配器模式 的第三种(一个有三种)的demo,叫做对象适配器模式:

    MainRun.java类,是程序运行入口,含有main方法。大伙认真的看main方法上面的注释喔,是博主对此模式的总结和分析。(附 advantage是表示使用此模式的优势,disadvantage是此模式的不足和缺点,use scene是表示此模式的使用场景。)

    package cn.cat.design.mode.adaptor.object;
    
    import cn.cat.design.mode.adaptor.clazz.Customer;
    import cn.cat.design.mode.adaptor.clazz.CustomerType;
    
    
    public class MainRun {
    
    	/**适配器模式(对象适配器):使得原本两个不相干的或不协调的类进行协调工作。对象适配模式:通过将原对象传入到适配器中,经过适配器的包装和协调,使其适用于目标类。
    	 * 
    	 * advantage: 使得不协调的类进行协调配合工作。
    	 * 			  通过对象传入的方式,可以在一个适配器中对多个对象进行适配,实现功能更强大的适配器。
    	 * 			
    	 * disadvantage:因为是通过对象传入的方式使其适配器工作,使得需要实现目标接口或抽象类的全部方法,并且如果同时对多个原对象进行适配,会导致其复杂性并且不符合类的单一职责。
    	 * 
    	 * use scene:当需要多个原对象进行适配才能满足目标类的功能需求时,或者是目标类型是抽象类的情形。
    	 * 
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		//美国籍客户
    		Customer customerAme = new Customer("tomcat",21,2,CustomerType.AMERICAN);
    		System.out.println("customerAme :" + customerAme.isValidInfo());
    		System.out.println("-------------------------------------------------------------");
    		//中国籍客户
    		Customer customerChi = new Customer("中",21,2,CustomerType.CHINESE);
    		System.out.println("customerChi :" + customerChi.isValidInfo());
    	
    	}
    
    }
    


    Customer.java

    package cn.cat.design.mode.adaptor.object;
    
    /**封装客户信息
     *
     * @author Cat(gwj)
     * date 2015-9-3
     * time 下午4:56:40
     */
    public class Customer{
    	/**姓名
    	 * 
    	 */
    	private String name;
    	/**年龄
    	 * 
    	 */
    	private int age;
    	/**vip等级
    	 * 
    	 */
    	private Integer vipGrade;
    	
    	/**
    	 * 客户类型s
    	 */
    	private CustomerType type;
    	
    	public Customer(String name, int age, Integer vipGrade, CustomerType type) {
    		super();
    		this.name = name;
    		this.age = age;
    		this.vipGrade = vipGrade;
    		this.type = type;
    	}
    	public CustomerType getType() {
    		return type;
    	}
    	public void setType(CustomerType type) {
    		this.type = type;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	public Integer getVipGrade() {
    		return vipGrade;
    	}
    	public void setVipGrade(Integer vipGrade) {
    		this.vipGrade = vipGrade;
    	}
    	
    	public boolean isValidInfo () {
    		AbstractValidator validtor = getValidatorByType();
    		return validtor.isValidData(name, age, vipGrade);
    	}
    	
    	public AbstractValidator getValidatorByType () {
    		AbstractValidator validator = null;
    		switch (type) {
    			case AMERICAN:
    				validator = new AmericanValidator();
    				break;
    			case CHINESE:
    				//因为已经存在旧的校验类,通过适配器来使旧的校验类适配Validator
    				validator = new ChineseValidatorAdaptor(new ChineseInfoJudge());		
    				break;
    						
    			case JAPANESE:
    				throw new UnsupportedOperationException();
    	
    			default:
    				throw new RuntimeException("未知的客户类型");
    		}
    		return validator;
    	}
    	
    }
    


    CustomerType.java

    package cn.cat.design.mode.adaptor.object;
    
    /**客户类型
     *
     * @author Cat(gwj)
     *  date 2015-9-6
     *  time 下午6:10:56
     */
    public enum CustomerType {
    	/**
    	 * 美国人
    	 */
    	AMERICAN,
    	/**
    	 * 中国人
    	 */
    	CHINESE,
    	/**日本人
    	 * 
    	 */
    	JAPANESE;
    }
    


    AbstractValidator.java

    package cn.cat.design.mode.adaptor.object;
    
    /**客户信息校验器抽象类。
     *
     * @author Cat(gwj)
     *  date 2015-9-6
     *  time 下午6:06:08
     */
    public abstract class  AbstractValidator {
    	/**是否有效数据。
    	 * @param name 姓名
    	 * @param age 年龄
    	 * @param vipGrade 会员等级
    	 * @return
    	 */
    	public abstract boolean isValidData (String name , int age , Integer vipGrade);
    }
    


    AmericanValidator.java

    package cn.cat.design.mode.adaptor.object;
    
    /**美国籍信息校验
     *
     * @author Cat(gwj)
     *  date 2015-9-6
     *  time 下午6:18:40
     */
    public class AmericanValidator extends AbstractValidator {
    
    	@Override
    	public boolean isValidData(String name, int age, Integer vipGrade) {
    		if (name == null || name.length() < 6) {
    			System.out.println("name 不符合规范");
    			return false;
    		}
    		if ( 0 >= age || age >= 100) {
    			System.out.println("age 不符合规范");
    			return false;
    		}
    		if (vipGrade == null || vipGrade < 1 || vipGrade > 5) {
    			System.out.println("vipGrade 不符合规范");
    			return false;
    		}
    		return true;
    	}
    
    }
    


    ChineseValidatorAdaptor.java

    package cn.cat.design.mode.adaptor.object;
    
    public class ChineseValidatorAdaptor extends AbstractValidator {
    	private ChineseInfoJudge judge = null;
    	
    	/**通过传递ChineseInfoJudge来适配AbstractValidator抽象类。
    	 * @param judge
    	 */
    	public ChineseValidatorAdaptor (ChineseInfoJudge judge) {
    		this.judge = judge;
    	}
    	
    
    	@Override
    	public boolean isValidData(String name, int age, Integer vipGrade) {
    		//直接调用原始校验方法
    		return judge.isJudgePassed(name, age, vipGrade, false);
    	}
    
    }
    



    ChineseInfoJudge.java

    package cn.cat.design.mode.adaptor.object;
    
    /**中国籍信息校验。
     * 假设此类是项目很早之前就已经存在的校验类,Validator接口是在项目后期在开始引入,故此类并没有实现Validator接口。
     *
     * @author Cat(gwj)
     *  date 2015-9-6
     *  time 下午6:23:20
     */
    public class ChineseInfoJudge {
    	/**是否校验通过
    	 * @param name 姓名
    	 * @param age	年龄
    	 * @param vipGrade	vip会员等级
    	 * @param isJudgeEmptyProperty 是否运行属性为空
    	 * @return
    	 */
    	public boolean isJudgePassed(String name, int age, Integer vipGrade , boolean isAllowEmptyProperty) {
    		
    		if (!isAllowEmptyProperty && (name == null || vipGrade == null )) {
    			System.out.println("name or vipGrade 为空");
    			return false;
    		}
    		
    		if (name != null && (name.length() < 2 || name.length() > 5)) {
    			System.out.println("name 不符合规范");
    			return false;
    		}
    		if ( 10 >= age || age >= 120) {
    			System.out.println("age 不符合规范");
    			return false;
    		}
    		if (vipGrade != null && ( vipGrade < 1 || vipGrade > 6)) {
    			System.out.println("vipGrade 不符合规范");
    			return false;
    		}
    		return true;
    	}
    
    
    }
    


    ------------------------------------------------------------demo end---------------------------------------------------------

  • 相关阅读:
    6-51单片机ESP8266学习-AT指令(8266TCP服务器--做自己的AndroidTCP客户端发信息给单片机控制小灯的亮灭)
    5-51单片机ESP8266学习-AT指令(8266TCP服务器--用手机TCP调试助手发信息给单片机控制小灯的亮灭)
    4-51单片机ESP8266学习-AT指令(测试TCP服务器--使用串口调试助手--不连接路由器)
    3-51单片机ESP8266学习-AT指令(学会刷固件)
    多线程之:synchonized锁实现的原理<一>
    多线程之:volatile变量的一次写操作的过程
    Spring 事务管理高级应用难点剖析: 第 3 部分
    Spring 事务管理高级应用难点剖析: 第 2 部分
    Spring 事务管理高级应用难点剖析: 第 1 部分
    多线程之:并发编程面临的挑战
  • 原文地址:https://www.cnblogs.com/catgwj/p/7604865.html
Copyright © 2011-2022 走看看