概述:
适配器模式是结构型设计模式之一;在不修改原来两块代码的情况下,将两个不兼容的类同和在一起;通过转换使他们协作起来.
定义:
适配器模式是把一个类的接口变换成客户端所期待的另一种接口,从而使原来因为接口不匹配无法在一起工作的两个类一起工作
使用:
1. 系统需要使用现有的类,而此类接口不符合系统的需要,即几口不兼容;
2.需要建立一个可以重复使用的类,用于关联彼此没有太大关联的一些类;
3.需要一个同一的输出接口,而输入端类型不确定;
适配器三种模式
1.类适配器 (没有关系的类和接口产生联系,可以拓展增加已有代码的复用性)(过程中需要用到继承)
2. 对象适配器(使用对象来进行连接:来拓展功能)
实例:类适配器:
//类适配器
class IPhone7{ //没有关系的类;
//听音乐的方法;
public void listenMusic(){
System.out.println("直接使用充电口进行充电")
}
}
//目标接口里面包含一个抽象方法
interface Target(){
//这是目标接口
public abstract void connection();
}
我们想在不改变上面类和接口的情况下 ,让上面的类和接口产生关系;
这时我们可以通过使用一个第三方的类(适配器)来实现这个;
class Adapter extends IPhone7 implements Target{
//实现重写抽象方法;
@Override
public void connction(){
System,out.println("使用转接头");
//调用父类的方法;使用充电口进行充电
super.listenMusic();
}
}
下面开始试验;
public static void main(String[] args){
//使用适配器的类
Target iphone7 = new Adapter();
iphone7.connection(); //这是接口,接口的作用就是在子类中实现父类的抽像方法; 如果Adapter 要调用自己特有方法;要向下转型;
//打印结果
使用转接头
直接使用充电口进行充电
}
2.缺省适配器;
缺省适配器(Default Adapter):缺省适配模式的核心。它实现Target角色接口,为所有方法提供空的实现(也就是{}的空实现)。d
//目标接口
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 WL extends MyAdapter{
//重写适配器类的方法
@Override
public void paoBuJi() {
System.out.println("跑步半小时");
}
}
1.字符串
1. 字符串是常量;
2.字符串和数组之间是怎样进行转换的;
//字符串转换成数组;
String string = " abc def ";
char [] charArray = string.toCharArray();
//数组转换成字符串;
String newstring = new String(charArray);
3.关于字符串的一些特点;
//s2的创建方式,相当于在方法区的常量池中,创建字符串
String s2 = "abc";
//s3的创建相当于在堆内存中开辟一片新的空间;
String s3= new String("abc")
String s1 = "liushangkuabc";
s1 = "wangl";
System.out.println(s1);
//修改的是字符串的地址,指向了不同的地址,而不是字符串本身被修改了;
//看系统方法的时候,但凡是拼接和截取等操作字符串的一类方法;都是带返回值的,说明返回的是一个新的字符串
String s4 = "abc";
// == 对象的话 比的是地址,不是对象比的是值;
System.out.println(s2==s4);//比的是地址
//equals 把两个字符串变成字符数组 一位一位的比较,比较的是内容;
System.out.println(s2.equals(s4));
System.out.println(s2==s3);
//s2和s3 有什么区别?
//s2是一个对象 s3是两个对象;"abc" 和 new 出来的对象;
2.字符串一些常用的方法;
获取: 1.获取字符串中单个字符: charAt(index);
2.获取索引值 :indexOf(' 字符') ;indexof( '字符', 4),前一个参数代表要寻找的字符,后一个数字代表从第几位开始找;
indexof("字符串");看字符串第一个字母所在的位置;
String s1 = "wanglong";
//注意不要越界;
char c = s1.charAt(1);
System.out.println(c);
//获取索引 只能找第一个
String s2 = "wanglong";
int index= s2.indexOf('g');//可以传字符和数字例如97;返回1;w的ascii;
System.out.println(index);//如果穿数字就是传入的ascii;
//从传入的索引这一位开始查找;
//[0.0) 留头舍尾; //如果传入一个没有的字符 x 返回-1;
int index1 = s2.indexOf('g',6);//前一个参数要找的字符 5和4 返回时有区别的;;
System.out.println(index1);
//传入字符串,查找相应的角标;
int index2 = s2.indexOf("long"); //传入 olong 返回-1;
System.out.println(index2);
判断:
1. contains("字符串"); 判断包含,判断字符串中是否有该字符串;
2. startsWith("字符串"): 判断前缀;
3 endsWith("字符串"); 判断后缀;
4 equals("字符串2") ;判断两个字符串是否相同;
5 equalsIgnoreCase("字符串2"); 判断两个字符串忽略大小写相等;
6 toLowerCase(); 字符串转小写;
7 toUpperCase();字符串转小写;
实例:
String string = "www.baidu.com";
// 判断包含;往里面穿字符串;方法的参数是一个接口;凡是继承这个接口的都可以往里面穿;
boolean rel1 = string.contains("baidu");
System.out.println(rel1);
// 判断前缀
boolean rel2 = string.startsWith("www");
System.out.println(rel2);
// 判断后缀 .txt.jpg.jpeg.png 可以判断照片后缀;
boolean rel3 = string.endsWith("com");
System.out.println(rel3);
// 判断两个字符串相等
boolean rel4 = string.equals(rel3);
// 判断两个字符串忽略大小写相等;
boolean rel5 = string.equalsIgnoreCase("Wanglong");
System.out.println(rel5);
// 字符串转小写
String s6 = string.toLowerCase();
System.out.println(s6);
// 字符串转大写
String s7 = string.toUpperCase();
System.out.println(s7);
替换 -- 分割--截取-- 比较- -去空格--字符串字符数组--字符串是否为空-
//替换字符和字符串 replace(''),replace("")
private static void fun1替换() {
// 替换字符
String string = "wanglong";
String s1 = string.replace('w', 'l');
System.out.println(s1);
//替换字符串
String s2 = string.replace("wang", "jiu");
System.out.println(s2);
}
}
//分割: split("填入分割符")
private static void fun2分割() {
// 字符串分割 返回值是数组 String[];
// 使用转义符号进行a.b.c \\. 进行分割;
String string = "wanglong,peng,liu";
String[] s1 = string.split(","); // ( \\. )分割 或者(g)分割;
// System.out.println(Arrays.toString(s1));
// 增强for 循环;(专门用来遍历的) //for e 快捷键;
// for(容器中数据类型:遍历容器) {}
for (String sy : s1) {
// String s相当于表示容器中的每一个元素 ;
System.out.println(sy);
}
}
//获取子字符串; substring(index),
// substring(start,end)
private static void fun3截取substring() {
// 获取子字符串
String s = "wanglong";
//从传入的这一位开始截取(包括3);
String s1 = s.substring(3);
System.out.println(s1);
//[0,3)留头舍弃尾巴;[0,2];
String s2 = s.substring(0, 3);
System.out.println(s2);
}
//去空格 trim();
String string = " abc def ";
String s1 = string.trim();
System.out.println(s1);
//字符串比较; compareTo(字符串2)
String s2 = "abcAB";
String s3 = "Ab";
// 相等返回的是0; 返回正值前面大;返回负数前面小;
// 字符串不一样的时候按照ascii马表返回字符串差值;b 98;
// 长度不一样的时候 返回的是位数的差值;
// 一位一位的进行比较,字符不一样就做差值;ascii差值;
int num = s2.compareTo(s3);
System.out.println(num);
private static void fun5字符串字符数组转化() {
//把字符数组转化成字符串;
char [] array = {'w','a','n','g'};
//使用构造方法转化;
String string = new String(array);
System.out.println(string);
//字符串转换成字符数组; // tocharArray();
String s1 = "wanglong";
char[] charArray = s1.toCharArray();
for (char c : charArray) {
System.out.println(c);
}
}
//判断字符串是否为空 isEmpty
String string = "";
boolean rel = string.isEmpty();
/* 1. abc def 字符串反转
* 1.转化成字符数组;
* 2.计算换位次数;
* 3.array[i] 和array[length-1-i]
*
*
* 2. abc def 字符串去空格;
* 1.只要找出开始和结束的索引,就可以了;
* 2.用charAt(start),
*
* 3. * "www"
* 在 "wwwasdwwwsnfjwwwsnsdkwwwjsd"
* string.indexOf();
*
* 4. * 打印下面两个字符串 中相同的 最大子字符串
* asakjfahellosdlmkasklhka
* mcnvbsehellolssphkp
*
*/
public class Demo练习题 {
public static void main(String[] args) {
// fun1字符串反转();
// fun将字符串找坐标去空格();
// www所在的字符串位置();
// 没见过就是不会;
String s1 = "sakjfahellosdlmkasklhka";
String s2 = "mcnvbsehellolssphkp";
// 先以短的字符串为参照物进行查找;
// 声明循环增量
int i = 0;
while (i < s2.length()) {
// 为了找到开始的索引和结束的索引;
int start = 0;
// 结束的索引;
// length-0;
// length-1;
// length-i;
int end = s2.length() - i;
// 截取最大字串;
while (end < s2.length()) { // 不能越界;end不能一直移动;
// 截取出来所有的字串;
String substring = s2.substring(start, end + 1);
System.out.println(substring);
// 跟s1这个字符串进行比对;判断包含;
if (s1.contains(substring)) {
// 第一个进来的就是最大字串;
System.out.println(substring);
// 结束该方法;
return;
}
// 让开始和结束的坐标 向前移动;
start++;
end++;
}
i++;
}
}
private static void www所在的字符串位置() {
String s1 = "wwwasdwwwsnfjwwwsnsdkwwwjsd";
//显然是有循环;哪个循环好;
// 把声明的变量全声明一遍;
String key = "www";
// 声明一个索引
int index = 0;
// 声明一个
int count = 0;
//循环截取字符串;
//判断该字符串中是否有该查找的字符创;
while (s1.contains(key)) {
//查找www在字符串中的索引;
index = s1.indexOf(key);
s1 = s1.substring(index+key.length());
count++;
}
System.out.println(count);
}
private static void fun将字符串找坐标去空格() {
// fun错误写法();
String string = " abc def ";
int start = 0;
int end = string.length() - 1;
// 计算开始坐标;
while (string.charAt(start) == ' ' && start < end) {
// 从前开始一位一位往后寻找;
start++;
}
// 计算结束坐标
while (string.charAt(end) == ' ' && start < end) {
// 从最后一位开始寻找;
end--;
}
// 截取字符串;
String substring = string.substring(start, end + 1);
System.out.println(substring);
}
private static void fun1字符串反转() {
String string = " abc def ";
// 字符串转换成数组;
char[] charArray = string.toCharArray();
int num = charArray.length / 2;
for (int i = 0; i < num; i++) {
char temp = charArray[i];
charArray[i] = charArray[charArray.length - 1 - i];
charArray[charArray.length - 1 - i] = temp;
}
// System.out.println(Arrays.toString(charArray));打印数组;
// 字符数组转换成字符串;
String newString = new String(charArray);
System.out.println(newString);
}
}