java设计模式大体分为23种设计模式,直接通过例子学习设计模式,更易于理解和思考其中的原理和作用,以下给出 适配器模式 的第一种(一个有三种)的demo,叫做类适配器模式:
MainRun.java类,是程序运行入口,含有main方法。大伙认真的看main方法上面的注释喔,是博主对此模式的总结和分析。(附 advantage是表示使用此模式的优势,disadvantage是此模式的不足和缺点,use scene是表示此模式的使用场景。)
package cn.cat.design.mode.adaptor.clazz;
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.clazz;
/**封装客户信息
*
* @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 () {
Validator validtor = getValidatorByType();
return validtor.isValidData(name, age, vipGrade);
}
public Validator getValidatorByType () {
Validator validator = null;
switch (type) {
case AMERICAN:
validator = new AmericanValidator();
break;
case CHINESE:
//因为已经存在旧的校验类,通过适配器来使旧的校验类适配Validator
validator = new ChineseValidatorAdaptor();
break;
case JAPANESE:
throw new UnsupportedOperationException();
default:
throw new RuntimeException("未知的客户类型");
}
return validator;
}
}
CustomerType.java
package cn.cat.design.mode.adaptor.clazz;
/**客户类型
*
* @author Cat(gwj)
* date 2015-9-6
* time 下午6:10:56
*/
public enum CustomerType {
/**
* 美国人
*/
AMERICAN,
/**
* 中国人
*/
CHINESE,
/**日本人
*
*/
JAPANESE;
}
Validator.java
package cn.cat.design.mode.adaptor.clazz;
/**客户信息校验器接口
*
* @author Cat(gwj)
* date 2015-9-6
* time 下午6:06:08
*/
public interface Validator {
/**是否有效数据。
* @param name 姓名
* @param age 年龄
* @param vipGrade 会员等级
* @return
*/
public boolean isValidData (String name , int age , Integer vipGrade);
}
AmericanValidator.java
package cn.cat.design.mode.adaptor.clazz;
/**美国籍信息校验
*
* @author Cat(gwj)
* date 2015-9-6
* time 下午6:18:40
*/
public class AmericanValidator implements Validator {
@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.clazz;
public class ChineseValidatorAdaptor extends ChineseInfoJudge implements Validator{
@Override
public boolean isValidData(String name, int age, Integer vipGrade) {
//直接调用原始校验方法
return isJudgePassed(name, age, vipGrade, false);
}
}
package cn.cat.design.mode.adaptor.clazz;
/**中国籍信息校验。
* 假设此类是项目很早之前就已经存在的校验类,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--------------------------------------------------------------