适配器设计模式
适配器模式将某个类的接口转换成客户端期望的另一个接口表示
主要目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作
其别名为包装器(Wrapper)
1.类适配器
令没有关系的类和接口产生联系
可以扩展功能 增加已有代码的复用性
例: iphone7只有一个充电接口
iphone6有充电接口和3.5mm的耳机插口
iphone7 听音乐时需要转接口连接耳机
class Iphohe7 {
public void listenMusic(){
System.out.println("直接使用充电接口")
}
}
// 目标接口
interface Target {
// 耳机连接的抽象方法
public abstract void connection();
}
class Iphone6 implements Target{
// 实现抽象方法
@Override
public void connection(){
System.out.println("使用3.5mm接口");
}
}
// 使用一个适配器类(第三方类)
// 通过该类 使类和接口产生联系 提高接口的兼容性
class Adapter extends Iphone7 implements Target{
// 实现抽象方法
public void connection(){
System.out.println("使用转接口");
super.listenMusic();
}
}
public static void main(String[] args) {
Target iphone6 = new Iphone6();
iphone6.connection();
// 使用适配器的类
Target iphone7 = new Adapter();
iphone7.connection();
}
2.对象适配器
io 使用对象进行连接 来扩展功能
3.缺省适配器
使用一个类作为桥梁 连接 类和接口
例: 健身房中有 跑步机 卧推 哑铃等健身器材(不清楚哪种会被使用)
人选择健身器材使用(实现健身房)
interface JSF{
public abstract void paoBuJi();
public abstract void woTui();
public abstract void yaLing();
}
// 使用一个适配器类(桥梁) 来实现接口 --- 空实现
// 只是对接口方法的空实现 不管具体怎么实现
// 不希望该适配器类 直接被使用
abstract class MyAdapter implements JSF {
@Override
public void paoBuJi() {
}
@Override
public void woTui() {
}
@Override
public void yaLing() {
}
}
// 建立类 这时可以直接继承适配器类(桥梁)
class Person extends MyAdapter {
// 选择使用的器材 重写适配器类对应的方法
// 重写适配器类的方法
@Override
public void paoBuJi() {
System.out.println("跑步半小时");
}
}
字符串类的系统方法
注意: 字符串是常量 程序运行当中不能被修改,被修改的是地址而不是字符串本身
String s1 = "lna";
s1 = "qwer";
// 修改的是 字符串引用(地址)
// 指向不同的地址 字符串本身是常量不能被修改
字符串的系统方法 如 拼接 截取 等修改字符串的一类方法中
都有一个返回值 都是返回一个新的字符串(本身无法修改)
String s2 = "abc";
// 在方法区的常量池中 创建一个字符串
String s3 = new String("abc");
// 在堆内存中 开辟一块空间
s2和s3的区别:
s2是一个对象 而 s3是两个对象 "abc"和new出来的对象
String s4 = "abc";
System.out.println(s2 == s4); // true
// 此处 s2和s4比较的是地址
System.out.println(s2.equals(s4)); // true
System.out.println(s2 == s3); // false
// equals 把两个字符串 变成字符数组 一位一位的进行比较
注意:
"=="号 两个对象比较的是地址 不是对象的话,比较的是值
string类中的获取方法:
根据索引 获取字符串中的字符(返回char型)
返回值类型char 方法 .charAt(int index);
String s1 = "asdfghjkl";
char c = string.charAt(5);
System.out.println(c); // h
根据字符 获取字符在字符串中的下标
返回值类型int 方法 .indexOf('char');
String s1 = "qwertyuiop";
int index = s1.indexOf('t');
System.out.println(index); // 4
从传入索引的一位开始查找字符的下标 (留头不留尾原则)
返回值类型int 方法 .indexOf('char',int);
int index1 = s1.indexOf('g',4);
System.out.println(index1); // 4
传入一个字符串 查找对应角标
返回值类型int 方法 .indexOf(string);
int index2 = s1.indexOf("yuio");
System.out.println(index2); // 5
string类中的判断方法:
返回布尔值类型
判断 包含关系、前缀和后缀
String string = "www.baidu.com";
// 判断包含
boolean rel1 = string.contains("www");
System.out.println(rel1);
// 判断前缀
boolean rel2 = string.startsWith("www");
System.out.println(rel2);
// 判断后缀
boolean rel3 = string.endsWith("com");
System.out.println(rel3);
判断两个字符串相等
返回值类型boolean 方法 .equals(string);
boolean rel4 = string.equals("haha");
System.out.println(rel4);
判断两个字符串相等(忽略大小写)
返回值类型boolean 方法 .equalsIgnoreCase(string);
boolean rel5 = string.equalsIgnoreCase("WwW.BAIDU.com");
System.out.println(rel5);
字符串转大小写
// 字符串转小写
String s1 = string.toLowerCase();
System.out.println(s1);
// 字符串转大写
String s2 = string.toUpperCase();
System.out.println(s2);
替换方法
返回值类型string 方法 .replace(string,string);
String string = "qwerty";
String s1 = string.replace('w', 'l');
System.out.println(s1); // qlerty
// 替换字符串
String s2 = string.replace("wer", "aaa");
System.out.println(s2);
切割方法
返回值类型 string[] 方法 .split("");
String string = "qwerty.asdfgh.zxcvbn";
// 正则表达式 使用转译符
String[] arr = string.split("\\."); // 正则表达式
System.out.println(Arrays.toString(arr));
// 增强for循环(专门用来遍历打印)
// for(容器中数据的类型 名字:遍历容器) { }
for(String a:arr) {
// String a 表示 容器中的每一个元素
System.out.println(a);
}
增强for循环(专门用来遍历打印)
for(容器中数据的类型 名字:遍历容器) { }
获取子字符串方法
截取 返回值类型 string 方法 .substring(int);
String string = "qwertyuiop";
// 从传入的索引这一位开始截取(包括3)
String s1 = string.substring(3);
System.out.println(s1); // rtyuiop
// 留头不留尾
String s2 = string.substring(4,8);
System.out.println(s2); tyui
去空格方法
返回值类型 string 方法 .trim();
String string = " abc def ";
String s1 = string.trim();
System.out.println(s1); // "abc def"
注意: 只能去掉两头的空格 中间的不变
比较方法
返回值类型 int 方法 .compareTo(string);
注意: 前面的字符串跟后面调用的比较
相等返回 0
返回正数 前面大
返回负数 前面小
字符串不一样时 按ASCII码表 返回两个字符的差值
长度不一样 返回的是 位数的差值
一位一位进行比较 字符不一样 就做差值
String s2 = "abcAB";
String s3 = "Ab";
int num = s2.compareTo(s3);
System.out.println(num);
字符数组与字符串的相互转化方法
char[] array = {'q','w','e','r','t'};
// 直接使用构造方法
String string = new String(array);
System.out.println(string);
String str = string.valueOf();
把字符串 转化为 字符数组
返回值类型char[] 方法 .toCharArray();
String str = "qwerty";
char[] arr = str.toCharArray();
for(char c : arr) {
System.out.println(c);
}
判断字符串是否为空
方法 .isEmpty();
String string = "";
boolean rel = string.isEmpty();
System.out.println(rel);
字符串拼接方法
方法 .concat(string);
// 连接符拼接
String s1 = "qwer";
String s2 = "asdfg";
String s3 = s1 + s2;
System.out.println(s3);
// 字符串拼接方法
String s4 = s3.concat(s2).concat("666");
System.out.println(s4);
基本数据类型转化为字符串方法
方法 .valueOf();
char[] c = {'c','v','b','n'};
String string = String.valueOf(c);
System.out.println(string); // cvbn