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();

心得体会

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

你可能感兴趣的:(2019-08-13 Day13 代理设计模式与系统方法(String))