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://因为已经存在旧的校验类,通过适配器来使旧的校验类适配Validatorvalidator = 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 {@Overridepublic 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{@Overridepublic 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--------------------------------------------------------------