目的:
学习代理设计模式,深入了解接口回调的原理,能更好地理解于运用,以及学习String字符串的相关知识点和相关函数方法。
知识点:
1.创建方法时,对普通类、抽象类和接口的选择:
实现一个方法; 三个选择
- 抽象类 普通类 接口
- 1.是否需要添加成员变量: 需要:抽象类 普通类
不需要:接口 - 2.添加的方法是否必须要实现: 必须:抽象类 接口
不需要:抽象类 普通类 - 3.我是需要提供模板还是提供通信的方式:
模板:抽象类
通信(数据传递):接口
2.String字符串的相关知识:
- String
* 1.不可变的字符串 一旦创建 内容不能改变 能被共享
* 2.可变的字符串
* StringBuffer
* StringBuilder
(1)== 与 equals 的区别:
- 对于字符串:
* == 比较的是两个变量的地址
* equals()比较的是变量的内容是否相同
对于非字符串变量,两者均比较变量的地址
String str0 = "cbd";
String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str0); //false
System.out.println(str0.equals(str1));//false
System.out.println(str1 == str2); // 重点:true 字符串是不可变的 能被共享,所有地址相同
System.out.println(str1.equals(str2));//true
(2)有关不可变字符串的一些函数方法的调用及其运行结果:
//使用构造方法
//null 和 "" 的区别
String str3 = new String(); //创建了就不能改变 为"" 没意义
byte[] name = {'a','b','c','d'};
String str4 = new String(name);
System.out.println(str4); //运行结果:abcd
byte[] name2 = {97,98,99};
String str5 = new String(name2);
System.out.println(str5); //运行结果:abc
//使用字节数组的一部分 创建一个字符串
String str6 = new String(name,0,3);
System.out.println(str6); //运行结果:abc
// char[] hello = {'你','好','啊'};
// String h = new String(hello);
// System.out.println(h);
//
// // 字符串有哪些方法
// // 获取字符串中的一个字符
// // charAt
// char c = h.charAt(0);
// System.out.println(c);
两个字符串的比较 compareTo comepareToIgnoreCase(忽略大小写)
两个字符串的连接
判断一个字符串是否包含另外一个字符串
// 可以知道大小关系 0:相同 >0:大于 <0:小于
int result = str4.compareToIgnoreCase(str5);
System.out.println(result); //运行结果:1
// 两个字符串的连接
// concat
// String nStr = str5.concat(h);
// System.out.println(nStr);
// 判断一个字符串是否包含另外一个字符串
// contains
boolean r = "hello".contains("lle");
System.out.println(r); //运行结果:false
boolean r1 = "hello".contains("he");
System.out.println(r1); //运行结果:true
判断是否以某个字符串结尾
String url = "http://www.baidu.com";
if (url.endsWith(".com")){
System.out.println("网址"); //运行结果:网址
}
if (url.startsWith("http")){
System.out.println("http协议");//运行结果:http协议
}
if (url.startsWith("www",7)){
System.out.println("万维网"); //运行结果:万维网
}
两个字符串进行比较
// equals
if ("abc".equals("ABC")){
System.out.println("相同");
}else{
System.out.println("不相同"); //运行结果:不相同
}
// 判断一个子字符串在另外一个字符串里面的位置
// indexOf 不存在返回值为-1
String i1 = "hello Java";
int index = i1.indexOf("Java");
System.out.println(index); //运行结果:6
// 获取字符串的长度
// length
获取子字符串
// substring 从index到结尾
String sStr = i1.substring(6);
System.out.println(sStr);
// 从0开始 到5
String sStr2 = i1.substring(4,7);
System.out.println(sStr2);
// 将字符串转化为字符数组
// toCharArray
// 将所有字符转化为小写
// toLowerCase / toUpperCase
// 将字符串前面和后面的空格字符删除
// trim()
(3)有关可变字符串的一些函数方法的调用及其运行结果:
数据的增删改查
//2.可变字符串
//StringBuffer 线程安全 效率不高
//StringBuilder 线程不安全 效率更高
//insert delete append replace
StringBuilder sb = new StringBuilder();
//append 在末尾追加
sb.append("I ");
sb.append("LOVE ");
sb.append("?");
System.out.println(sb);
//insert 插入数据
sb.insert(1," also");
System.out.println(sb);
//replace 替换
//参数: start ebd String
int start = sb.indexOf("?");
int end = start+"?".length();
sb.replace(start,end,"YOU");
System.out.println(sb);
// reverse 反转
sb.reverse();
System.out.println(sb);
实际编程:
Read类、Chat类、Message类等 都需要设置字体颜色和大小
Setting类就完成这个功能 所以大家都去找Setting类实现:
1.Read类和Chat类的定义:
public class Read {
private String text;
private String color;//默认字体颜色
private int size; //默认字体大小
public Read(String text){
this.text = text;
}
//模拟进入设计界面
public void gotoSetting(){
//1.创建设计界面的对象
Setting setting = new Setting(this);
//2.推送到设计界面
setting.start();
}
//提供给外部一个方法 可以通过这个方法给我传值
public void change(String color, int size){
System.out.println("设置前字体颜色:"+this.color+" 字体大小:"+this.size);
this.color = color;
this.size = size;
System.out.println("设置后字体颜色:"+this.color+" 字体大小:"+this.size);
}
// @Override
// public void chance(String color, int size) {
// System.out.println("设置前字体颜色:"+this.color+" 字体大小:"+this.size);
//
// this.color = color;
// this.size = size;
//
// System.out.println("设置后字体颜色:"+this.color+" 字体大小:"+this.size);
// }
}
public class Chat {
private String text;
private String color;
private int size;
public Chat(String text){
this.text = text;
}
public void gotoSetting(){
Setting setting = new Setting(this);
setting.start2();
}
public void change(String color, int size){
System.out.println("设置前字体颜色:"+this.color+" 字体大小:"+this.size);
this.color = color;
this.size = size;
System.out.println("设置后字体颜色:"+this.color+" 字体大小:"+this.size);
}
// @Override
// public void chance(String color, int size) {
// System.out.println("设置前字体颜色:"+this.color+" 字体大小:"+this.size);
//
// this.color = color;
// this.size = size;
//
// System.out.println("设置后字体颜色:"+this.color+" 字体大小:"+this.size);
// }
}
2.Setting类中
1.接收外部的对象:
Read read;
Chat chat;
//创建对象时 就需要告诉我 你是谁
public Setting(Read read){
this.read = read;
}
public Setting(Chat chat){
this.chat = chat;
}
2.实现数据回调:
//开始设置
public void start(){
System.out.println("开始设置");
System.out.println("。。。。。");
System.out.println("设置完毕 即将返回结果");
read.change("红色",30);
}
public void start2(){
System.out.println("开始设置");
System.out.println("。。。。。");
System.out.println("设置完毕 即将返回结果");
chat.change("红色",30);
}
代码的结构问题:
1.每添加一个对象使用Setting类,就必须添加一个这个类的一个对象和构造方法
2.每一个类都有自己的接收方法 导致方法不统一
解决问题:
问题1:
使用多态来接受子类:
Object object;
public Setting(Object object){
this.object = object;
}
// Read read;
// Chat chat;
//
// //创建对象时 就需要告诉我 你是谁
// public Setting(Read read){
// this.read = read;
// }
// public Setting(Chat chat){
// this.chat = chat;
// }
使用时再强制转换为子类对象
问题2:
定义一个接口,统一管理传递数据方式,并且能保证每个使用Setting的类都必须实现这个方法
定义内部接口并创建对象,传递参数
/**
* 设计界面 设文本字体大小和颜色
*/
public class Setting {
/**
* 记录为谁设置字体颜色和大小
* 记录下我做完事情后 将数据返回给谁
*/
FontSettingInterface fontSettingInterface;
public Setting(FontSettingInterface fontSettingInterface){
this.fontSettingInterface = fontSettingInterface;
}
// Read read;
// Chat chat;
//
// //创建对象时 就需要告诉我 你是谁
// public Setting(Read read){
// this.read = read;
// }
// public Setting(Chat chat){
// this.chat = chat;
// }
interface FontSettingInterface{
void chance(String color, int size);
}
public void start(){
System.out.println("开始设置");
System.out.println("。。。。。");
System.out.println("设置完毕 即将返回结果");
fontSettingInterface.chance("红色",30);
}
// //开始设置
// public void start(){
// System.out.println("开始设置");
// System.out.println("。。。。。");
// System.out.println("设置完毕 即将返回结果");
//
// chat.change("红色",30);
//
// }
}
实现这个Setting的步骤:
3.运用与结果:
/**
* 接口实现回调 代理设计模式
*/
public class Myclass {
public static void main(String[] args){
Read read = new Read("text");
read.gotoSetting();
System.out.println();
Chat chat = new Chat("text2");
chat.gotoSetting();
}
}
开始设置
。。。。。
设置完毕 即将返回结果
设置前字体颜色:null 字体大小:0
设置后字体颜色:红色 字体大小:30
开始设置
。。。。。
设置完毕 即将返回结果
设置前字体颜色:null 字体大小:0
设置后字体颜色:红色 字体大小:30
心得:
今天学习任务很轻松,早上的知识是对昨天的理解与加深,下午则是了解字符串的相关函数,最后结束时留下一个小任务倒是充满了未知数哦。