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

ChineseInfoJudge.java

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--------------------------------------------------------------

转载于:https://www.cnblogs.com/catgwj/p/7604867.html

适配器模式(类适配器)相关推荐

  1. 【设计模式】适配器模式 ( 类适配器代码模板 | 对象适配器代码模板 | 适配器模式示例 )

    文章目录 I . 适配器模式 ( 类适配器 ) 代码模板 II . 适配器模式 ( 对象适配器 ) 代码模板 III . 适配器模式 代码示例 I . 适配器模式 ( 类适配器 ) 代码模板 1 . ...

  2. 【设计模式】适配器模式 ( 概念 | 适用场景 | 优缺点 | 外观模式对比 | 适配器模式相关角色 | 类适配器 | 对象适配器 | 实现流程 )

    文章目录 I . 适配器模式概念 II . 适配器模式 适用场景 III . 适配器模式 优缺点 IV . 适配器模式 与 外观模式对比 V . 适配器模式 相关角色 ( 重点 ) VI . 适配器模 ...

  3. C++设计模式——适配器模式(对象适配器、类适配器)

    http://blog.jobbole.com/109381/?winzoom=1 前言 现在的笔记本都只存在USB接口,用来口,电脑上存在的是USB接口,两者如何通信呢?可以使用USB转串口线连接电 ...

  4. 适配器模式(类适配器,对象适配器,接口适配器)

    现实生活中的适配器例子 泰国插座用的是两孔的(欧标),可以买个多功能转换插头(适配器) ,这样就可以使用了. 基本介绍 适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一 ...

  5. 设计模式--适配器模式 (类适配器和对象适配器)

    适配器模式很常用的:商城中的例子比如快递发货,那么多种快递公司:可能每个快递公司的接口对接都不一样都要适配:比如各种框架中的类似以下思想的代码,都是为了适配. public function beha ...

  6. 适配器模式——类适配器模式,对象适配器模式

    概述 如果去欧洲国家去旅游的话,他们的插座如下图最左边,是欧洲标准. 而我们使用的插头如下图最右边的.因此我们的笔记本电脑,手机在当地不能直接充电. 所以就需要一个插座转换器,转换器第1面插入当地的插 ...

  7. 设计模式适配器模式_适配器设计模式示例

    设计模式适配器模式 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要 ...

  8. 双向适配器 java_类适配器,双向适配器

    不兼容结构的协调--适配器模式(三) 类适配器 除了对象适配器模式之外,适配器模式还有一种形式,那就是类适配器模式,类适配器模式和对象适配器模式最大的区别在于适配器和适配者之间的关系不同,对象适配器模 ...

  9. 适配器模式之类适配器与对象适配器的区别及代码实现

    什么是适配器模式? 适配器模式(Adapter):直观理解就是使原来不能一起相互工作(接口不兼容)的两个功能通过Adapter兼容在一起. 类适配器和对象适配器 类适配器 Adapter 类继承Ada ...

最新文章

  1. 数据库数据用Excel导出的3种方法
  2. centos解压zip命令_2、centos下安装elasticsearch-head
  3. java将字符串逻辑表达式转成布尔值
  4. Flask Web 开发 错误页面自定义
  5. OSPF 多区域配置
  6. comcerter无法识别串口_基于FPGA 的MXN维字符识别的实现
  7. QImage QPixmap Mat区别
  8. 企业巧妙运用飞秋提高工作效率
  9. php中函数前加符号的作用分解
  10. python对seo有什么用_现在做seo会运用到python吗
  11. 浅谈App-V(附:参考资料)
  12. HTML img 标签的 alt 属性
  13. 使用LaTeX给PDF加背景
  14. 南昌大学c语言第八章函数答案,南昌大学计算机C语言答案8
  15. 马老师的996,不是鸡汤,是​我的人生信条!
  16. 软件测试工程师未来十年的职业规划
  17. 混乱是怎样炼成的——《C解毒》试读
  18. 王者荣耀的服务器是什么系统,王者荣耀健康系统 健康系统是什么
  19. 快速完成会议记录的智慧之选,讯飞智能录音笔SR502表现出色
  20. HashSet和HashMap

热门文章

  1. tableau linux无网络安装_四十二、Linux网络管理,软件安装,进程管理总结
  2. python中cmd是什么_python中的cmd是什么
  3. WebSocket实现实时通信
  4. 九、ES6的箭头函数
  5. python网络爬虫系列(八)——常见的反爬手段和解决方法
  6. Chapter1-2_Speech_Recognition(LAS)
  7. 天池 在线编程 捡胡萝卜(模拟)
  8. LeetCode 1101. 彼此熟识的最早时间(排序+并查集)
  9. LeetCode 1486. 数组异或操作
  10. 数据结构--二叉查找树 Binary Search Tree