目的
学习代理设计模式,实现文本界面与设计界面的信息交换,同时实现自己的功能;学习关于系统方法String相关,理解其相关用法,实现将其运用进入代码
代理设计模式
概念
代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能
这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法
举个例子来说明代理的作用:假设我们想邀请一位明星,那么并不是直接连接明星,而是联系明星的经纪人,来达到同样的目的.明星就是一个目标对象,他只要负责活动中的节目,而其他琐碎的事情就交给他的代理人(经纪人)来解决.这就是代理思想在现实中的一个例子
实例
对Read类、Chat类、Message类设置字体颜色和大小,而使用Setting类来完成这个功能,所以大家都去找Setting类来实现设置字体颜色和大小
问题:
1.每添加一个对象使用Setting类,就必须添加一个这个类的一个对象和对应的构造方法
Read r1;
Chat c1;
//创建对象的时候 就需要告诉我 你是谁
public setting(Read r1){
this.r1 = r1;
}
public setting(Chat c1){
this.c1 = c1;
}
2.每个类有其对应的接收方法,所以导致方法不统一
//提供给外部一个方法 可以通过这个方法给我传值
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);
}
//在Chat页面也需要提供一个方法接收外部传递的参数
public void doChange(String color, int size){
System.out.println("改变后的颜色:"+color+" 改变后的大小:"+size);
}
//在Message页面也需要提供一个方法接收外部传递的参数
public void againChange(String color, int size){
System.out.println("改变后的颜色:"+color+" 改变后的大小:"+size);
}
解决办法
1.使用多台来接收子类
Object obj1;
public Setting(Object obj1){
this.obj1 = obj1;
}
具体使用的时候还是要强制转化为子类对象 ,每个⼦子类都有自己的接收方法
if(obj instanceof Chat){
Chat c1 = (Chat) obj;
if(c1 != null){
c1.doChange("红色",20);
}
}
if(obj instanceof Message){
Message m1 = (Message) obj;
if(m1 != null){
m1.againChange("红色",20);
}
}
if(obj instanceof Read){
Read r1 = (Read) obj;
if(r1 != null){
r1.change("红色",20);
}
}
接口、抽象类和普通类的选择
- 1.是否需要添加成员变量 需要就只有两个选择——抽象类&普通类 不需要就为接口
- 2.添加的方法是不是必须要实现 必须就为抽象类&接口 否则为抽象类&普通类
- 3.是需要提供模板还是通信方法 模板就是抽象类 通信方式就是接口(数据传递)
2.定义一个接口,统一管理传递数据的方式,并且能保证每个使用Setting的类都必须实现这个方法
定义Setting内部接口
//使用接口定义一套方法 强制使用者来实现这个方法
//能保证我需要传值的时候 就能找到这个方法
public interface FontSettingInterface{
//自己规定的方法
void change(String color, int size);
}
创建对象
//记录为谁设置颜色和大小
//记录下我做完事情之后 将数据返回给谁
//使用多台
FontSettingInterface obj;
public setting(FontSettingInterface obj){
this.obj = obj;
}
传递数据或者参数
public void startSetting(){
System.out.println("开始设置");
System.out.println("······");
System.out.println("设置完毕 即将返回结果");
obj.change("黑色",20);
使用Setting这个类
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+" 改变前的大小:"+this.size);
this.color = color;
this.size = size;
System.out.println("改变后的颜色:"+this.color+" 改变后的大小:"+this.size);
}
}
public class Chat implements setting.FontSettingInterface {
//模拟进入设置页面
public void goToSetting(){
//1.创建设置页面的对象
setting setting = new setting(this);
//2.推送到设置页面
setting.startSetting();
}
//在Chat页面也需要提供一个方法接收外部传递的参数
@Override
public void change(String color, int size){
System.out.println("改变后的颜色:"+color+" 改变后的大小:"+size);
}
}
测试方法
public class MyClass {
public static void main(String[] args){
Read read = new Read("lllllllll");
read.goToSetting();
Chatting chatting = new Chatting(" ");
chatting.goToSetting();
}
}
系统方法String
String类具有各种方法来初始化字符串
String str1 = "abc";
或
String str3 = new String();//没意义
或
//使用字节数组 创建一个字符串
byte[] name = {'a','b','c'};
String str4 = new String(name);
或
byte[] name2 = {97,98,99};
String str5 = new String(name2);
或
//使用字节数组的一部分 创建一个字符串
String str6 = new String(name,0,2);
或
char[] hello = {'你','好','啊'};
String h = new String(hello);
字符串有哪些方法
获取字符串中的一个字符(charAt)
char c = h.charAt(0);
System.out.println(c);
两个字符串的比较 (compareTo)
可以知道大小关系,结果为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("lle");
System.out.println(r);
判断是否以某个字符串开头,某个字符串结尾
String url = "http://www.baidu.com";
if(url.endsWith(".com")){
System.out.println("网站");
}
if(url.startsWith("http")){
System.out.println("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);
获取子字符串 substring 从index到结尾
String sStr = i1.substring(6);
System.out.println(sStr);
从字符串转化为字符数组 toCharArray
将所有字符转化为小/大写 toLowerCase / toUpperCase
可变字符串
有两种可变字符串,原理是不创建新对象,直接在原对象上进行更改:
1.StringBuffer 线程安全 效率不高
2.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 替换
参数分别为start end string
int start = sb.indexOf("Android");
int end = start + "Android".length();
sb.replace(start, end, "you");
System.out.println(sb);
reverse 反转
sb.reverse();
心得体会
今天早上的内容有一些困难,还需要对其多复习多理解;而今天下午的知识更偏向书本,需要多加记忆