目的
學(xué)習(xí)代理設(shè)計(jì)模式,實(shí)現(xiàn)文本界面與設(shè)計(jì)界面的信息交換晤斩,同時(shí)實(shí)現(xiàn)自己的功能焕檬;學(xué)習(xí)關(guān)于系統(tǒng)方法String相關(guān),理解其相關(guān)用法澳泵,實(shí)現(xiàn)將其運(yùn)用進(jìn)入代碼
代理設(shè)計(jì)模式
概念
代理(Proxy)是一種設(shè)計(jì)模式,提供了對(duì)目標(biāo)對(duì)象另外的訪問方式;即通過代理對(duì)象訪問目標(biāo)對(duì)象.這樣做的好處是:可以在目標(biāo)對(duì)象實(shí)現(xiàn)的基礎(chǔ)上,增強(qiáng)額外的功能操作,即擴(kuò)展目標(biāo)對(duì)象的功能
這里使用到編程中的一個(gè)思想:不要隨意去修改別人已經(jīng)寫好的代碼或者方法,如果需改修改,可以通過代理的方式來擴(kuò)展該方法
舉個(gè)例子來說明代理的作用:假設(shè)我們想邀請(qǐng)一位明星,那么并不是直接連接明星,而是聯(lián)系明星的經(jīng)紀(jì)人,來達(dá)到同樣的目的.明星就是一個(gè)目標(biāo)對(duì)象,他只要負(fù)責(zé)活動(dòng)中的節(jié)目,而其他瑣碎的事情就交給他的代理人(經(jīng)紀(jì)人)來解決.這就是代理思想在現(xiàn)實(shí)中的一個(gè)例子
實(shí)例
對(duì)Read類、Chat類兼呵、Message類設(shè)置字體顏色和大小兔辅,而使用Setting類來完成這個(gè)功能,所以大家都去找Setting類來實(shí)現(xiàn)設(shè)置字體顏色和大小
問題:
1.每添加一個(gè)對(duì)象使用Setting類击喂,就必須添加一個(gè)這個(gè)類的一個(gè)對(duì)象和對(duì)應(yīng)的構(gòu)造方法
Read r1;
Chat c1;
//創(chuàng)建對(duì)象的時(shí)候 就需要告訴我 你是誰
public setting(Read r1){
this.r1 = r1;
}
public setting(Chat c1){
this.c1 = c1;
}
2.每個(gè)類有其對(duì)應(yīng)的接收方法维苔,所以導(dǎo)致方法不統(tǒng)一
//提供給外部一個(gè)方法 可以通過這個(gè)方法給我傳值
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頁面也需要提供一個(gè)方法接收外部傳遞的參數(shù)
public void doChange(String color, int size){
System.out.println("改變后的顏色:"+color+" 改變后的大小:"+size);
}
//在Message頁面也需要提供一個(gè)方法接收外部傳遞的參數(shù)
public void againChange(String color, int size){
System.out.println("改變后的顏色:"+color+" 改變后的大小:"+size);
}
解決辦法
1.使用多臺(tái)來接收子類
Object obj1;
public Setting(Object obj1){
this.obj1 = obj1;
}
具體使用的時(shí)候還是要強(qiáng)制轉(zhuǎn)化為子類對(duì)象 ,每個(gè)?子類都有自己的接收方法
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.是否需要添加成員變量 需要就只有兩個(gè)選擇——抽象類&普通類 不需要就為接口
- 2.添加的方法是不是必須要實(shí)現(xiàn) 必須就為抽象類&接口 否則為抽象類&普通類
- 3.是需要提供模板還是通信方法 模板就是抽象類 通信方式就是接口(數(shù)據(jù)傳遞)
2.定義一個(gè)接口介时,統(tǒng)一管理傳遞數(shù)據(jù)的方式,并且能保證每個(gè)使用Setting的類都必須實(shí)現(xiàn)這個(gè)方法
定義Setting內(nèi)部接口
//使用接口定義一套方法 強(qiáng)制使用者來實(shí)現(xiàn)這個(gè)方法
//能保證我需要傳值的時(shí)候 就能找到這個(gè)方法
public interface FontSettingInterface{
//自己規(guī)定的方法
void change(String color, int size);
}
創(chuàng)建對(duì)象
//記錄為誰設(shè)置顏色和大小
//記錄下我做完事情之后 將數(shù)據(jù)返回給誰
//使用多臺(tái)
FontSettingInterface obj;
public setting(FontSettingInterface obj){
this.obj = obj;
}
傳遞數(shù)據(jù)或者參數(shù)
public void startSetting(){
System.out.println("開始設(shè)置");
System.out.println("······");
System.out.println("設(shè)置完畢 即將返回結(jié)果");
obj.change("黑色",20);
使用Setting這個(gè)類
public class Read implements setting.FontSettingInterface {
private String text;
private String color;//默認(rèn)的顏色
private int size;//默認(rèn)的字體大小
public Read(String text){
this.text = text;
}
//模擬進(jìn)入設(shè)置頁面
public void goToSetting(){
//1.創(chuàng)建設(shè)置頁面的對(duì)象
setting setting = new setting(this);
//2.推送到設(shè)置頁面
setting.startSetting();
}
//提供給外部一個(gè)方法 可以通過這個(gè)方法給我傳值
@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 {
//模擬進(jìn)入設(shè)置頁面
public void goToSetting(){
//1.創(chuàng)建設(shè)置頁面的對(duì)象
setting setting = new setting(this);
//2.推送到設(shè)置頁面
setting.startSetting();
}
//在Chat頁面也需要提供一個(gè)方法接收外部傳遞的參數(shù)
@Override
public void change(String color, int size){
System.out.println("改變后的顏色:"+color+" 改變后的大小:"+size);
}
}
測(cè)試方法
public class MyClass {
public static void main(String[] args){
Read read = new Read("lllllllll");
read.goToSetting();
Chatting chatting = new Chatting(" ");
chatting.goToSetting();
}
}
系統(tǒng)方法String
String類具有各種方法來初始化字符串
String str1 = "abc";
或
String str3 = new String();//沒意義
或
//使用字節(jié)數(shù)組 創(chuàng)建一個(gè)字符串
byte[] name = {'a','b','c'};
String str4 = new String(name);
或
byte[] name2 = {97,98,99};
String str5 = new String(name2);
或
//使用字節(jié)數(shù)組的一部分 創(chuàng)建一個(gè)字符串
String str6 = new String(name,0,2);
或
char[] hello = {'你','好','啊'};
String h = new String(hello);
字符串有哪些方法
獲取字符串中的一個(gè)字符(charAt)
char c = h.charAt(0);
System.out.println(c);
兩個(gè)字符串的比較 (compareTo)
可以知道大小關(guān)系,結(jié)果為0:相同 >0:大于 <0:小于
int result = str4.compareTo(str5);
System.out.println(result);
字符串的連接(concat)
String nstr = str5.concat(h);
System.out.println(nstr);
判斷一個(gè)字符串是否包含另一個(gè)字符串(contains)
boolean r = "hello".contains("lle");
System.out.println(r);
判斷是否以某個(gè)字符串開頭凌彬,某個(gè)字符串結(jié)尾
String url = "http://www.baidu.com";
if(url.endsWith(".com")){
System.out.println("網(wǎng)站");
}
if(url.startsWith("http")){
System.out.println("http協(xié)議");
}
if(url.startsWith("www",7)){
System.out.println("萬維網(wǎng)");
}
兩個(gè)字符串進(jìn)行比較 equals
if("abc".equals("ABC")){
System.out.println("相同");
}else{
System.out.println("不相同");
}
判斷一個(gè)子字符串在另一個(gè)字符串里面的位置 indexOf
不存在返回值為-1
String i1 = "hello Java";
int index = i1.indexOf("Java");
System.out.println(index);
獲取子字符串 substring 從index到結(jié)尾
String sStr = i1.substring(6);
System.out.println(sStr);
從字符串轉(zhuǎn)化為字符數(shù)組 toCharArray
將所有字符轉(zhuǎn)化為小/大寫 toLowerCase / toUpperCase
可變字符串
有兩種可變字符串沸柔,原理是不創(chuàng)建新對(duì)象,直接在原對(duì)象上進(jìn)行更改:
1.StringBuffer 線程安全 效率不高
2.StringBuilder 線程不安全的 效率高
// 創(chuàng)建的同時(shí)先準(zhǔn)備好6個(gè)字符的空間
StringBuilder sb = new StringBuilder(6);
append 在末尾追加
sb.append("I");
sb.append(" Love");
sb.append(" Android");
System.out.println(sb);
insert 插入數(shù)據(jù)
sb.insert(2,"also ");
System.out.println(sb);
replace 替換
參數(shù)分別為start end string
int start = sb.indexOf("Android");
int end = start + "Android".length();
sb.replace(start, end, "you");
System.out.println(sb);
reverse 反轉(zhuǎn)
sb.reverse();
心得體會(huì)
今天早上的內(nèi)容有一些困難铲敛,還需要對(duì)其多復(fù)習(xí)多理解褐澎;而今天下午的知識(shí)更偏向書本,需要多加記憶