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);
}
}
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---------------------------------------------------------