(一)、代理设计模式
-
目的:
实现文本界面与设置界面的信息交流,实现各自的功能。
- 方法一:不使用接口,普通方法实现
步骤一:创建一个阅读界面,其中实现方法:模拟进入设置界面、提供一个方法使得外部能够传值
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.startSetting();
}
//提供外部一个方法可以通过这个方法给我传值
public void change(String color,int size){
System.out.println("改变前的颜色:"+this.color);
System.out.println("改变前的字体:"+this.size);
this.color = color;
this.size = size;
System.out.println("改变后的颜色:"+color);
System.out.println("改变后的字体:"+size);
}
}
步骤二:创建设置界面记录事件并且将数据进行返回,实现对字体颜色和大小的设置
public class Setting {
//记录为谁设置颜色和大小
//记录下我做完这件事之后 将数据返回
Read r1;
//创建对象的时候 就需要告诉我你是谁
public Setting(Read r1){
this.r1 = r1;
}
//开始设置
public void startSetting(){
System.out.println("开始设置");
System.out.println("........");
System.out.println("设置完毕 即将返回结果");
r1.change("黑色",20);
}
}
步骤三:主函数直接创建阅读界面的对象并且调用前往设置方法实现功能
public class Myclass {
public static void main(String[] args){
Read read = new Read("text");
read.gotoSetting();
}
}
-
总结:此方法虽然清晰易懂但是,在面对多个界面时,每多一个界面就需要创建这个界面,在设置界面就要多记录一次,在startSetting里面还需要进行判断。可操作性不高。
- 方式二:使用接口
步骤一:提供的构造方法和模拟进入界面与之前都没有区别,在外部传值方法出现了差异,因为阅读界面与设置界面实现了接口
public class Read implements Setting.FontSettingInterface {
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.startSetting();
}
//提供外部一个方法可以通过这个方法给我传值
@Override
public void change(String color, int size) {
System.out.println("改变前的颜色:"+this.color);
System.out.println("改变前的字体:"+this.size);
this.color = color;
this.size = size;
System.out.println("改变后的颜色:"+color);
System.out.println("改变后的字体:"+size);
}
}
步骤二:定义一个内部接口,用这个方法使得使用者都必须使用这个方法
public class Setting {
FontSettingInterface obj;
public Setting(FontSettingInterface obj){
this.obj = obj;
}
//使用接口定义一套方法 强制使用者来使用这个方法
public interface FontSettingInterface{
//自己规定
public void change(String color,int size);
}
//开始设置
public void startSetting(){
System.out.println("开始设置");
System.out.println("........");
System.out.println("设置完毕 即将返回结果");
obj.change("黑色",20);
}
}
步骤三:主函数中就可以以同样的方法实现功能
public class Myclass {
public static void main(String[] args){
Read read = new Read("text");
read.gotoSetting();
Chat chat = new Chat();
chat.gotoSetting();
}
}
-
总结:此方法解决了当出现多个界面时代码的繁杂以及不断的类型转化问题,通过接口让使用者使用同一套方法,使得代码更加清晰,简单
(二)、小结
抽象类 普通类 接口什么时候使用
- 1.是否添加成员变量
如果需要:抽象类 普通类
不需要则是:接口 - 2.添加的方法是不是必须要实现
必须:抽象类 接口
不需要:抽象类 普通类 - 3.需要提供模板还是通信方式
模板:抽象类
通信方式:接口
(三)、系统中的数组方法
- 数组分类:
String:不可变的字符串 一旦被创建 内容不能改变 可以被共享
StringBuffer、StringBuilder 可变字符串
String的系统方法:
- 等号与equals
"=":比较的是地址
"equals":比较的是内容
String str = "abc";
String str2 = "abc";
System.out.println(str==str2); //等号比较两个对象是否相同:地址
System.out.println(str.equals(str2));//equals比较内容是否相同
- 使用字节数组 创建一个字符串
会将整数通过对应ASCLL码进行转换
byte[] name = {'a','b','c'}; = byte[] name1 = {97,98,99};
String str4 = new String(name);
System.out.println(str4);
- 使用字节数组的一部分 创建一个字符串
byte[] name = {'a','b','c'};
String str6 = new String(name,0,3);
System.out.println(str6);
- 获取字符串中的一个字符
方法:charAt
char[] hello = {'你','好','啊'};
String h = new String(hello);
char c = h.charAt(0);
System.out.println(c);
- 两个字符串的比较
方法:compareTo(不忽略大小写) compareToIgnoreCase(忽略大小写)
结果:0相等 //<0后面大// >0前面大
int result = str4.compareTo(str5);
System.out.println(result);
- 两个字符串的连接
方法:concat
String nstr = str5.concat(h);
System.out.println(nstr);
- 判断一个字符串是否包含另外一个字符串
方法:contains
boolean r = "hello".contains("ll");
System.out.println(r);
String ur1 = "http://www.baidu.com";
if(ur1.endsWith(".com")){
System.out.println("网址");
}
if(ur1.startsWith("http")){
System.out.println("http协议");
}
if(ur1.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);
- 获取字符串的长度
方法:length
String i1 = "hello java";
int length = i1.length;
System.out.println(index);
- 获取子字符串
方法:substring
String i1 = "hello java";
String sStr = i1.substring(6);
System.out.println(sStr);
- 得到某一个范围内的字符串
方法: String sStr2 = i1.substring(起始,末尾);
String sStr2 = i1.substring(0,5);
System.out.println(sStr2);
- 将字符串转换为字符数组
方法:toCharArray - 将所有字符转化为小写/大写
- 将字符串前面和后面的空格字符删除
方法:trim()
可变字符串的系统方法:
- 可变字符串
StringBuffer 线程安全 效率不高
StringBuilder 线程不安全 效率更高 - 创建可变字符串的同时先准备好6个字符空间
StringBuilder sb = new StringBuilder(6);
- 在末尾增加
方法:append
sb.append("I");
sb.append(" Love");
sb.append(" Android");
System.out.println(sb);
- 插入数据
方法:insert
sb.insert(2,"also ");
System.out.println(sb);
- 替换
方法:replace
int start = sb.indexOf("Android");
int end = start+"Android".length();
sb.replace(start,end,"You");
System.out.println(sb);
- 反转
方法:reverse
sb.reverse();
System.out.println(sb);
(四)、今日小结:
今天算是比较轻松的一天,能听懂了,能跟上节奏了,也许是内容简单了吧。只不过不管简单与否,都是态度问题。决心决定你要做什么,态度决定你能做成什么。学习需要的是一种沉得下心的态度以及能否花时间专研的决心,不管做什么沉稳与坚持都是成功的诀窍。