2019-08-13 Day13 代理设计模式与系统方法(String)


目的

学习代理设计模式,实现文本界面与设计界面的信息交换,同时实现自己的功能;学习关于系统方法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();

心得体会

今天早上的内容有一些困难,还需要对其多复习多理解;而今天下午的知识更偏向书本,需要多加记忆

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,852评论 6 13
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,082评论 1 32
  • 目的: 学习代理设计模式,深入了解接口回调的原理,能更好地理解于运用,以及学习String字符串的相关知识点和相关...
    我也不知道_2c95阅读 315评论 0 0
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 2,362评论 0 4
  • 陪伴,一个看似简单平常的词汇。 从古至今,无数文人雅士对它都有着不同的解读。它是白居易口中“天长地久有时尽,此恨绵...
    肠粉淋芝麻酱阅读 356评论 0 1