Strategy(策略) - java 源碼中的策略模式

標(biāo)簽(空格分隔): 設(shè)計(jì)模式


前言

Strategy(策略)設(shè)計(jì)模式是設(shè)計(jì)架構(gòu)時(shí)候常用到的設(shè)計(jì)模式之一。我們開發(fā)中常常遇到這樣的情況:在實(shí)現(xiàn)某一個(gè)功能的時(shí)候,根據(jù)不同的環(huán)境和情況實(shí)現(xiàn)不同的算法和規(guī)則(比如排序功能)补箍。很多人解決的方案就是用if else代替,if(xx)就用a排序方案压昼,if(yy)就用b排序方案送滞,else....。功能的確能實(shí)現(xiàn)朽褪, 但是以后擴(kuò)展和維護(hù)起來相當(dāng)不容易置吓。遇到這樣的情況(在實(shí)現(xiàn)某一個(gè)功能的時(shí)候,根據(jù)不同的環(huán)境和情況實(shí)現(xiàn)不同的算法和規(guī)則)缔赠,我們可以嘗試用策略設(shè)計(jì)模式來解決這樣的問題衍锚。

場(chǎng)景1.對(duì)一組[1,2,6,4,3,2]進(jìn)行排序,會(huì)怎么寫嗤堰?

  • 程序設(shè)計(jì)1
public class MainActivity extends Activity{
    TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.tv_content);
        //數(shù)組創(chuàng)建
        Integer a[] = {1,2,6,4,3,2};
        //數(shù)組排序
        DataSorter.sort(a);
        //數(shù)組輸出到界面
        tv.setText(toStringArray(a));
    }


    /**
     * 把數(shù)組轉(zhuǎn)成一段字符串輸出到界面
     * @param a
     * @return  一段排好序的字符串
     */
    public String toStringArray(Integer[] a) {
        String str = "";
        for(int i=0; i<a.length; i++) {
            str += a[i].toString() + ",";
        }
        return str;
    }
}
/**
 * Created by liangjunjie on 16/6/16.
 * 排序工具
 */
public class DataSorter {

    public static void sort(int[] a) {
        for(int i=a.length; i>0; i--) {
            for(int j=0; j<i-1; j++) {
                if(a[j] > a[j+1]) {
                    swap(a, j , j+1);
                }
            }
        }
    }

    private static void swap(int[] a, int x, int y) {
        int temp = a[x];
        a[x] = a[y];
        a[y] = temp;
    }

}

排序算法:
![](A14A9750-93DC-488A-9B18-8F8DBC1D5BCF.png)
![](A14A9750-93DC-488A-9B18-8F8DBC1D5BCF.png)

結(jié)果:

![](36647C2C-F803-44FD-9380-AC749638C600.png)
![](36647C2C-F803-44FD-9380-AC749638C600.png)


場(chǎng)景2.加入現(xiàn)在我要排序的不是一組 數(shù)字了戴质,是要對(duì)一組 貓按照體重來排序。

  • 程序設(shè)計(jì)2
public class MainActivity extends Activity{
    TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.tv_content);
        //數(shù)組創(chuàng)建
        Cat kitty = new Cat("kitty", 3);//kitty,3kg置森,1year
        Cat tony = new Cat("tony", 6);//tony斗埂, 5kg, 2year
        Cat himit = new Cat("himit", 6);//himt, 6kg 3year

        Cat a[] = {kitty, tony, himit};
        //數(shù)組排序
        DataSorter.sort(a);
        //數(shù)組輸出到界面
        tv.setText(toStringArray(a));
    }


    /**
     * 把數(shù)組轉(zhuǎn)成一段字符串輸出到界面
     * @param a
     * @return  一段排好序的字符串
     */
    public String toStringArray(Cat[] a) {
        String str = "";
        for(int i=0; i<a.length; i++) {
            str += a[i].toString() + ",";
        }
        return str;
    }
}
public class Cat {
    public Cat(String name, int weight) {
        this.name = name;
        this.weight = weight;
    }

    public String name;
    public int weight;

    @Override
    public String toString() {
        return "name-" + name + " weight-" + weight;
    }
}
/**
 * Created by liangjunjie on 16/6/16.
 * 排序工具
 */
public class DataSorter {
    public static void sort(Cat[] a) {
        for(int i=a.length; i>0; i--) {
            for(int j=0; j<i-1; j++) {
                if(((Cat)a[j]).weight > ((Cat)a[j+1]).weight) {
                    swap(a, j , j+1);
                }
            }
        }
    }

    private static void swap(Cat[] a, Integer x, Integer y) {
        Cat temp = a[x];
        a[x] = a[y];
        a[y] = temp;
    }
}

結(jié)果:

image_1ao5pvh8n1rfh16ov1a9l18v07pr1j.png-27.4kB
image_1ao5pvh8n1rfh16ov1a9l18v07pr1j.png-27.4kB

功能的確實(shí)現(xiàn)了凫海。

但出現(xiàn)缺點(diǎn):

1.要修改更換排序的東西呛凶,就必須修改 DataSort 類,違背了設(shè)計(jì)原則的:《開閉原則》 - 對(duì)擴(kuò)展開放行贪,對(duì)修改關(guān)閉漾稀。

2.也是違背了設(shè)計(jì)原則中的:《依賴倒置原則》 - 高層模塊不應(yīng)該依賴低層模塊,二者都應(yīng)該依賴其抽象建瘫。就是說崭捍,類 DataSort依賴了 Cat 類,如果以后要對(duì) Dog 排序啰脚,那么就必須修改 DataSort 的類殷蛇,更改依賴對(duì)象把 Cat 改為 Dog。


場(chǎng)景3.現(xiàn)在我需要對(duì)貓的名字的長(zhǎng)度進(jìn)行排序橄浓,就是 實(shí)現(xiàn)結(jié)果為:(himit2 ,kitty, tony),要求設(shè)計(jì)成更下次改回對(duì)貓的體重修改的時(shí)候粒梦,要能改 DataSort修改。

  • 程序設(shè)計(jì)3
//main 不用動(dòng)
public class MainActivity extends Activity{
    TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.tv_content);
        //數(shù)組創(chuàng)建
        Cat kitty = new Cat("kitty", 3);//kitty荸实,3kg匀们,1year
        Cat tony = new Cat("tony", 6);//tony, 5kg准给, 2year
        Cat himit = new Cat("himit", 6);//himt, 6kg 3year

        Cat a[] = {kitty, tony, himit};
        //數(shù)組排序
        DataSorter.sort(a);
        //數(shù)組輸出到界面
        tv.setText(toStringArray(a));
    }


    /**
     * 把數(shù)組轉(zhuǎn)成一段字符串輸出到界面
     * @param a
     * @return  一段排好序的字符串
     */
    public String toStringArray(Cat[] a) {
        String str = "";
        for(int i=0; i<a.length; i++) {
            str += a[i].toString() + ",";
        }
        return str;
    }
}
/**
 * Created by liangjunjie on 16/6/16.
 * 增加一個(gè) Comparable接口
 */
public interface Comparable<T> {
    int compareTo(T o);
}
/**
 * Created by liangjunjie on 16/6/16.
 * 排序工具
 * DataSort 不在依賴 Cat 了泄朴,改為依賴接口(抽象)Comparable。
 */
public class DataSorter {
    public static void sort(Comparable[] a) {
        for(int i=a.length; i>0; i--) {
            for(int j=0; j<i-1; j++) {
                Comparable o1 = a[j];
                Comparable o2 = a[j+1];
                if(o1.compareTo(o2) == 1) {
                    swap(a, j , j+1);
                }
            }
        }
    }

    private static void swap(Comparable[] a, int x, int y) {
        Comparable temp = a[x];
        a[x] = a[y];
        a[y] = temp;
    }
}
/**
 * Created by liangjunjie on 16/6/16.
 * cat 實(shí)現(xiàn)接口 Comparable
 */
public class Cat implements Comparable<Cat>{
    public Cat(String name, int weight) {
        this.name = name;
        this.weight = weight;
    }

    public String name;
    public int weight;

    @Override
    public String toString() {
        return "name-" + name + " weight-" + weight;
    }

    @Override
    public int compareTo(Cat o) {
        if(this.name.length() > o.name.length()) {
            return 1;
        } else if(this.name.length() < o.name.length()) {
            return -1;
        }  else {
            return 0;
        }
    }
}

結(jié)果:


![](E0C9B690-98C0-4D55-8D8F-85AF2D9B1076.png)
![](E0C9B690-98C0-4D55-8D8F-85AF2D9B1076.png)

改到到這里露氮,你會(huì)發(fā)現(xiàn)這樣的更改祖灰,以后更排序方式,不要對(duì) cat 的名字長(zhǎng)度排序畔规,而是改回之前對(duì)體重進(jìn)行排序夫植,DataSort 真的不用進(jìn)行修改,只要對(duì) Cat 類的 compareTo(Cat o) 方法進(jìn)行一下修改油讯,就可以回到按體重排序。

/**
 * Created by liangjunjie on 16/6/16.
 */
public class Cat implements Comparable<Cat>{
    public Cat(String name, int weight) {
        this.name = name;
        this.weight = weight;
    }

    public String name;
    public int weight;

    @Override
    public String toString() {
        return "name-" + name + " weight-" + weight;
    }

    @Override
    public int compareTo(Cat o) {
        //改這里
        if (this.weight > o.weight) {
            return 1;
        } else if (this.weight < o.weight) {
            return -1;
        } else {
            return 0;
        }
    }
}

結(jié)果:
![](EB1441FB-8E1E-48E5-9EC2-B19381358C52.png)
![](EB1441FB-8E1E-48E5-9EC2-B19381358C52.png)

但是還不夠完善啊延欠,雖然我不用動(dòng) DataSort類了陌兑,但我還是要?jiǎng)?Cat 類啊,有無方法由捎,DataSort 類和 Cat 類都不用動(dòng)呢兔综?


場(chǎng)景4.現(xiàn)在我修改對(duì)貓的其他屬性排序,對(duì)我們封裝好的東西不用動(dòng)(不用動(dòng) Cat,不用動(dòng) DataSort)软驰,只需要修改我們的 main 就可以涧窒。

  • 程序設(shè)計(jì)4。給貓?zhí)砑右粋€(gè) --- 比較器锭亏。
/**
 * Created by liangjunjie on 16/6/16.
 * 比較器
 */
public interface Comparator<T> {
    int compare(T o1, T o2);
}
/**
 * Created by liangjunjie on 16/6/16.
 * 貓的體重比較器
 */
public class CatWeightComparator implements Comparator<Cat> {
    @Override
    public int compare(Cat o1, Cat o2) {
        if(o1.weight > o2.weight) {
            return 1;
        } else if(o1.weight < o2.weight) {
            return -1;
        }  else {
            return 0;
        }
    }
}
/**
 * Created by liangjunjie on 16/6/16.
 */
public class Cat implements Comparable<Cat>{
    public String name;
    public int weight;

    public Cat(String name, int weight, Comparator comparator) {
        this.name = name;
        this.weight = weight;
        this.comparator = comparator;
    }

    
    public Cat(String name, int weight) {
        this.name = name;
        this.weight = weight;
    }


    @Override
    public String toString() {
        return "name-" + name + " weight-" + weight;
    }

    @Override
    public int compareTo(Cat o) {
        //修改這里纠吴,根據(jù)傳入來的策略來比較
        return comparator.compare(this, o);
    }
}

/**
 * Created by liangjunjie on 16/6/16.
 * 排序工具
 */
public class DataSorter {
    public static void sort(Comparable[] a) {
        for(int i=a.length; i>0; i--) {
            for(int j=0; j<i-1; j++) {
                Comparable o1 = a[j];
                Comparable o2 = a[j+1];
                if(o1.compareTo(o2) == 1) {
                    swap(a, j , j+1);
                }
            }
        }
    }

    private static void swap(Comparable[] a, int x, int y) {
        Comparable temp = a[x];
        a[x] = a[y];
        a[y] = temp;
    }
}
/**
 * Created by liangjunjie on 16/6/16.
 */
public class MainActivity extends Activity{
    TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.tv_content);
        //修改這里
        CatNameComparator nameComparator = new CatNameComparator();
        //數(shù)組創(chuàng)建
        Cat kitty = new Cat("kitty", 3, nameComparator);//kitty,3kg慧瘤,1year
        Cat tony = new Cat("tony", 5, nameComparator);//tony戴已, 5kg, 2year
        Cat himit = new Cat("himit2", 6, nameComparator);//himt, 6kg 3year

        Cat a[] = {kitty, tony, himit};
        //數(shù)組排序
        DataSorter.sort(a);
        //數(shù)組輸出到界面
        tv.setText(toStringArray(a));
    }


    /**
     * 把數(shù)組轉(zhuǎn)成一段字符串輸出到界面
     * @param a
     * @return  一段排好序的字符串
     */
    public String toStringArray(Cat[] a) {
        String str = "";
        for(int i=0; i<a.length; i++) {
            str += a[i].toString() + "\n";
        }
        return str;
    }
}

這樣子锅减,默認(rèn)就是按照了 weight 進(jìn)行排序了

結(jié)果:

![](E0C9B690-98C0-4D55-8D8F-85AF2D9B1076.png)
![](E0C9B690-98C0-4D55-8D8F-85AF2D9B1076.png)

貌似上面的真的還有一個(gè)地方不靠譜糖儡,每次 newcat 的時(shí)候也傳入一個(gè)比較器,所以想了一下怔匣,比較器應(yīng)該是在 DataSort 類的時(shí)候傳入去的握联,所以修改成這樣

  • 程序設(shè)計(jì)4,Comparable 接口可以不用了
/**
 * Created by liangjunjie on 16/6/16.
 */
public class MainActivity extends Activity{
    TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.tv_content);
        CatNameComparator nameComparator = new CatNameComparator();
        //數(shù)組創(chuàng)建
        Cat kitty = new Cat("kitty", 3);//kitty每瞒,3kg金闽,1year
        Cat tony = new Cat("tony", 5);//tony, 5kg独泞, 2year
        Cat himit = new Cat("himit2", 6);//himt, 6kg 3year

        Cat a[] = {kitty, tony, himit};
        //數(shù)組排序
        DataSorter.sort(a, nameComparator);
        //數(shù)組輸出到界面
        tv.setText(toStringArray(a));
    }


    /**
     * 把數(shù)組轉(zhuǎn)成一段字符串輸出到界面
     * @param a
     * @return  一段排好序的字符串
     */
    public String toStringArray(Cat[] a) {
        String str = "";
        for(int i=0; i<a.length; i++) {
            str += a[i].toString() + "\n";
        }
        return str;
    }
}
/**
 * Created by liangjunjie on 16/6/16.
 * 比較器
 */
public interface Comparator<T> {
    int compare(T o1, T o2);
}
public class Cat{
    public String name;
    public int weight;



    public Cat(String name, int weight) {
        this.name = name;
        this.weight = weight;
    }


    @Override
    public String toString() {
        return "name-" + name + " weight-" + weight;
    }

}
/**
 * Created by liangjunjie on 16/6/16.
 */
public class CatNameComparator implements Comparator<Cat> {
    @Override
    public int compare(Cat o1, Cat o2) {
        if(o1.name.length() > o2.name.length()) {
            return 1;
        } else if(o1.name.length() < o2.name.length()) {
            return -1;
        }  else {
            return 0;
        }
    }
}
/**
 * Created by liangjunjie on 16/6/16.
 * 排序工具呐矾, 修改了這個(gè)關(guān)鍵類
 */
public class  DataSorter {
    public static <T extends Comparable<? super T>> void sort(T[] a, Comparator<T> comparator) {
        for(int i=a.length; i>0; i--) {
            for(int j=0; j<i-1; j++) {
                T o1 = a[j];
                T o2 = a[j+1];
                if(comparator.compare(o1, o2) >= 1) {
                    swap(a, j , j+1);
                }
            }
        }
    }

    private static <T extends Comparable<? super T>> void swap(T[] a, int x, int y) {
        T temp = a[x];
        a[x] = a[y];
        a[y] = temp;
    }
}
/**
 * Created by liangjunjie on 16/6/16.
 */
public class MainActivity extends Activity{
    TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.tv_content);
        //修改這里
        CatNameComparator nameComparator = new CatNameComparator();
        //數(shù)組創(chuàng)建
        Cat kitty = new Cat("kitty", 3);//kitty,3kg懦砂,1year
        Cat tony = new Cat("tony", 5);//tony蜒犯, 5kg, 2year
        Cat himit = new Cat("himit2", 6);//himt, 6kg 3year

        Cat a[] = {kitty, tony, himit};
        //數(shù)組排序
        DataSorter.sort(a, nameComparator);
        //數(shù)組輸出到界面
        tv.setText(toStringArray(a));
    }


    /**
     * 把數(shù)組轉(zhuǎn)成一段字符串輸出到界面
     * @param a
     * @return  一段排好序的字符串
     */
    public String toStringArray(Cat[] a) {
        String str = "";
        for(int i=0; i<a.length; i++) {
            str += a[i].toString() + "\n";
        }
        return str;
    }
}

結(jié)果:


![](E0C9B690-98C0-4D55-8D8F-85AF2D9B1076.png)
![](E0C9B690-98C0-4D55-8D8F-85AF2D9B1076.png)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荞膘,一起剝皮案震驚了整個(gè)濱河市罚随,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌羽资,老刑警劉巖淘菩,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異屠升,居然都是意外死亡潮改,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門腹暖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汇在,“玉大人,你說我怎么就攤上這事脏答「庋常” “怎么了亩鬼?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)阿蝶。 經(jīng)常有香客問我雳锋,道長(zhǎng),這世上最難降的妖魔是什么羡洁? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任玷过,我火速辦了婚禮,結(jié)果婚禮上焚廊,老公的妹妹穿的比我還像新娘冶匹。我一直安慰自己,他們只是感情好咆瘟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布嚼隘。 她就那樣靜靜地躺著,像睡著了一般袒餐。 火紅的嫁衣襯著肌膚如雪飞蛹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天灸眼,我揣著相機(jī)與錄音卧檐,去河邊找鬼。 笑死焰宣,一個(gè)胖子當(dāng)著我的面吹牛霉囚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播匕积,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼盈罐,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了闪唆?” 一聲冷哼從身側(cè)響起盅粪,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悄蕾,沒想到半個(gè)月后票顾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帆调,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年奠骄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片番刊。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡含鳞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出撵枢,到底是詐尸還是另有隱情民晒,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布锄禽,位于F島的核電站潜必,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏沃但。R本人自食惡果不足惜磁滚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宵晚。 院中可真熱鬧垂攘,春花似錦、人聲如沸淤刃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逸贾。三九已至陨仅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铝侵,已是汗流浹背灼伤。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咪鲜,地道東北人狐赡。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像疟丙,于是被迫代替她去往敵國(guó)和親颖侄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,097評(píng)論 25 707
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法隆敢,類相關(guān)的語法发皿,內(nèi)部類的語法,繼承相關(guān)的語法拂蝎,異常的語法穴墅,線程的語...
    子非魚_t_閱讀 31,625評(píng)論 18 399
  • 昨天,我對(duì)面的同事小s被人事調(diào)動(dòng)去了別的部門温自,一個(gè)比現(xiàn)在更加忙碌玄货、任務(wù)更加繁重的部門。小s來了大概一年多悼泌,沒到兩年...
    經(jīng)典_cj閱讀 174評(píng)論 4 2
  • 喵喵: 我坐在走廊最邊角的地方看著你馆里,你在20米外走廊的另一端隘世,拿著那只完好的左眼看著我可柿,我知道你看不清我,最起碼...
    晶晶亮的沙子閱讀 303評(píng)論 0 3
  • “與惡龍纏斗過久丙者,自身亦成為惡龍复斥。凝視深淵過久,深淵將回以凝視械媒∧慷В”——尼采 他打開記事本,看了看上面病人的名字纷捞。今...
    清書_閱讀 1,331評(píng)論 22 51