设计模式 | 适配器模式(adapter)
定义:
结构:(书中图,侵删)
实例:
package designpattern.adapter; import java.util.HashSet;
import java.util.Set; public class ForeignIdentify {
String socailSecurityNumber; // 模拟一个社保号的数据库
static Set<String> dbSet = new HashSet<>();
static {
dbSet.add("F001");
dbSet.add("F002");
dbSet.add("F003");
} public boolean check(String socailSecurityNumber) {
if (dbSet.contains(socailSecurityNumber)) {
System.out.println(socailSecurityNumber + "是外国的合法公民");
return true;
} else {
System.out.println(socailSecurityNumber + "不是外国的合法公民");
return false;
} }
}
package designpattern.adapter; import java.util.HashSet;
import java.util.Set; public class ChineseIdentify {
String idCardNumber; // 模拟一个身份证号的数据库
static Set<String> dbSet = new HashSet<>();
static {
dbSet.add("张三C001");
dbSet.add("李四C002");
dbSet.add("王五C003");
} public boolean check(String idCardNumber, String name) {
if (dbSet.contains(name + idCardNumber)) {
System.out.println(name + idCardNumber + "是中国的合法公民");
return true;
} else {
System.out.println(name + idCardNumber + "不是中国的合法公民");
return false;
} }
}
package designpattern.adapter; import java.util.HashMap;
import java.util.Map; public class ChinesePassport extends ForeignIdentify {
ChineseIdentify chineseIdentify = new ChineseIdentify(); // 模拟身份证、名字对应数据库
static Map<String, String> db = new HashMap<>();
static {
db.put("C001", "张三");
db.put("C002", "李四");
db.put("C003", "王五"); } @Override
public boolean check(String idCardNumber) {
// 为了模拟两个接口不完全一样,假设中国的身份验证需要身份证号和名字两个条件
return chineseIdentify.check(idCardNumber, getName(idCardNumber));
} private String getName(String idCardNumber) {
return db.get(idCardNumber);
}
}
package designpattern.adapter;
public class Client {
public static void main(String[] args) {
ForeignIdentify foreignIdentify = new ForeignIdentify();
enter("F001", foreignIdentify);
enter("F004", foreignIdentify);
// 直接用身份证号来验证
enter("C003", foreignIdentify);
// 换成护照
foreignIdentify = new ChinesePassport();
enter("C003", foreignIdentify);
}
public static void enter(String number, ForeignIdentify foreignIdentify) {
System.out.println("=============外国入关==============");
if (foreignIdentify.check(number)) {
System.out.println("允许入关!");
} else {
System.out.println("禁止入关!");
}
}
}
结果输出:
=============外国入关==============
F001是外国的合法公民
允许入关!
=============外国入关==============
F004不是外国的合法公民
禁止入关!
=============外国入关==============
C003不是外国的合法公民
禁止入关!
=============外国入关==============
王五C003是中国的合法公民
允许入关!
总结:
设计模式 | 适配器模式(adapter)的更多相关文章
- 设计模式 - 适配器模式(adapter pattern) 具体解释
适配器模式(adapter pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 适配器模式(adapter pattern): 将一个类的接 ...
- 设计模式 - 适配器模式(adapter pattern) 枚举器和迭代器 具体解释
适配器模式(adapter pattern) 枚举器和迭代器 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考适配器模式(adapter patter ...
- 设计模式--适配器模式Adapter(结构型)
一.适配器模式 适配器模式的主要作用是在新接口和老接口之间进行适配.将一个类的接口转换成客户端期望的另外一个接口.其实适配器模式有点无赖之举,在前期设计的时候,我们就不应该考虑适配器模式,而应该通过重 ...
- 说说设计模式~适配器模式(Adapter)
返回目录 之前和大家一起谈了工厂模式和单例模式,今天来看一下另一种非常常用的模式,它就是适配器模式,第一次看到这个模式是通过“张逸”老师的“设计之道”这篇文章,在这里表adapter讲的很透彻,今天把 ...
- [工作中的设计模式]适配器模式adapter
一.模式解析 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 也就是说,如果已经写好了一个接口,但是又来了一种截然不同的接口,如 ...
- C#设计模式——适配器模式(Adapter Pattern)
一.概述在软件开发中,常常会想要复用一个已经存在的组件,但该组件的接口却与我们的需要不相符,这时我们可以创建一个适配器,在需复用的组件的接口和我们需要的接口间进行转换,从而能够正常的使用需复用的组件. ...
- 设计模式-适配器模式(Adapter)
简介: 适配器模式在我看来是最无聊的一种模式,因为他根本不是一种新的创意模式,而是一种不得已而为之的模式.就算不学适配器模式,在具体应用场景中也会自然而然的想到这种解决方案. 张三在英国留学时买了个笔 ...
- 大话设计模式--适配器模式 Adapter -- C++实现实例
1.适配器模式: 将一个类的接口转换为客户希望的另一个接口,使得原来由于接口不能一起工作的那些类一起工作. 适配器模式一般用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况. 适配器模式分 ...
- [设计模式]适配器模式Adapter
将一个类的接口转换成客户希望的另外一个接口. A d a p t e r模式使得原本 由于接口不兼容而不能一起工作的那些类可以一起工作.
- 设计模式(五)适配器模式Adapter(结构型)
设计模式(五)适配器模式Adapter(结构型) 1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相 ...
随机推荐
- <SpringMvc>入门二 常用注解
1.@RequestMapping @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME ...
- springboot+idea+jsp 404问题
我是这么解决的 对于单一项目,加入以下jar包即可. <!--前台页面的支持--> <dependency> <groupId>javax.servlet</ ...
- man中文手册安装
转载自 https://www.cnblogs.com/fyc119/p/7116295.html man中文手册安装 下载源码 wget https://src.fedoraproject.org/ ...
- buf.readFloatBE()
buf.readFloatBE(offset[, noAssert]) buf.readFloatLE(offset[, noAssert]) offset {Number} 0 noAssert { ...
- vs2012+ winform+.net4.0发布如何在xp上运行
今天在英文版vs2013打包发布4.0(非4.0 client)的winform时,遇到了在xp上无法运行的情况,.net framework 4.0在xp上已安装.在打包前,winform工程,即菜 ...
- 第十三节:web爬虫之Redis数据存储
下面仅仅展示Redis的set()集合存储,并不完整,后期会对Redis进行全面的介绍.... 此时数据已经存储到Redis当中
- 洛谷 2824 [HEOI2016/TJOI2016]排序
[题意概述] 对一个1到n的排列做m次区间排序,最后询问位置q上面的数. [题解] 区间排序的效率是nlogn,所以暴力做的话效率是mnlogn,显然达不到要求. 我们考虑二分答案.如果某个位置的数比 ...
- 百练2755:神奇的口袋(简单dp)
描述有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an.John可以从这些物品中选择一些 ...
- [luoguP2158] [SDOI2008]仪仗队(数论)
传送门 可以看出 (i, j) 能被看到,(i * k, j * k) 都会被挡住 暴力 所以 gcd(i, j) == 1 的话 ans ++ 那么可以枚举一半(中轴对称),求解答案,只能拿30分 ...
- 【BZOJ4650&UOJ219】优秀的拆分(二分,hash)
题意: 思路: 在实现时SA可以用hash+二分代替,会多一个log BZ上跑的飞快,但UOJ上extra卡出翔,已经放弃 不过转C或者写SA没准就过了 看来转C迫在眉睫 ; ..]of int64; ...