日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

設(shè)計(jì)模式學(xué)習(xí)筆記(二)——Singleton單件模式

 skywood 2007-08-06

       這是我寫(xiě)模式設(shè)計(jì)的第二篇,首先來(lái)說(shuō)說(shuō)設(shè)計(jì)模式的分類(lèi)。

       基本的23種設(shè)計(jì)模式從目的上可分為三種:

1、  創(chuàng)建型(Creational)模式:負(fù)責(zé)對(duì)象創(chuàng)建。

2、  結(jié)構(gòu)型(Structural)模式:處理類(lèi)與對(duì)象間的組合,可以解決一些繼承依賴(lài)性的問(wèn)題

3、  行為型(Behavioral)模式:類(lèi)與對(duì)象交互中的職責(zé)分配,可以解決組件間如何和交互,隔離變化。

下面來(lái)說(shuō)說(shuō)單件模式:

首先說(shuō)說(shuō)單件模式產(chǎn)生的動(dòng)機(jī),也就是為什么會(huì)出現(xiàn)單件模式。有一些類(lèi)在系統(tǒng)中只存在一個(gè)實(shí)例才能確保他們的邏輯正確性以及良好的效率。這時(shí)我想到我遇到的一個(gè)問(wèn)題。我曾經(jīng)遇到一個(gè)WinForm程序,運(yùn)行后出現(xiàn)一個(gè)登陸框,輸入用戶(hù)名密碼后點(diǎn)擊登陸,然后顯示一個(gè)登陸后的界面。但是點(diǎn)擊登陸后,程序要做一些操作,由于這段操作用時(shí)相對(duì)較長(zhǎng),在不經(jīng)意時(shí),我有點(diǎn)擊了一次登陸按鈕,最后出現(xiàn)了兩個(gè)對(duì)話(huà)框。如:我現(xiàn)在有兩個(gè)Form窗體Form1Form2。Form1上有一個(gè)按鈕用來(lái)打開(kāi)Form2并隱藏自己。我們可以這樣寫(xiě):

         private void button1_Click(object sender, System.EventArgs e)

        {

            Form2 form = new Form2();

            form.Show();

            this.Hide();

    }

如果我們?cè)陲@示Form2前由一些比較耗時(shí)的操作。如:我們讓線(xiàn)程的沉睡10秒在顯示Form2,當(dāng)我們?cè)诰€(xiàn)程沉睡時(shí)繼續(xù)點(diǎn)擊Form1上的Button,有可能就會(huì)出現(xiàn)兩個(gè)Form2的窗體。(我試過(guò)可以出現(xiàn)兩個(gè)Form2,如果你有心試但沒(méi)事出來(lái)別拿西紅柿砍我,哈哈)

        private void button1_Click(object sender, System.EventArgs e)

        {

            Thread.Sleep(10000);

            Form2 form = new Form2();

            form.Show();

            this.Hide();

    }

這種情況出現(xiàn)不能怪客戶(hù)多點(diǎn)了一下,也不能說(shuō)是編譯器不夠智能,應(yīng)該是我們程序上的Bug,我想這種情況用單件模式應(yīng)該可以解決。

單件模式的使用意圖就是:保證一個(gè)類(lèi)僅有一個(gè)實(shí)例,并提供一個(gè)該實(shí)例全局的訪問(wèn)點(diǎn)(這句話(huà)當(dāng)然不是我先說(shuō)的,是引用Gof在《設(shè)計(jì)模式》中的一句話(huà))

那類(lèi)的設(shè)計(jì)者如何繞過(guò)常規(guī)的構(gòu)造器來(lái)實(shí)現(xiàn)單件模式呢?下面就來(lái)談?wù)剢渭J降膶?shí)現(xiàn)。

單件模式在結(jié)構(gòu)上使用了景泰方法來(lái)約束構(gòu)造器(也就是構(gòu)造函數(shù))創(chuàng)建對(duì)象。

在單線(xiàn)程的情況下:私有化構(gòu)造函數(shù),使類(lèi)的使用者調(diào)用不到這個(gè)構(gòu)造函數(shù)來(lái)new一個(gè)實(shí)例。類(lèi)型中可以自己new一個(gè)實(shí)例。類(lèi)中創(chuàng)建一個(gè)靜態(tài)私有變量和Static公有屬性。在公有屬性中實(shí)現(xiàn)此類(lèi)的實(shí)例化。這樣在第一次請(qǐng)求時(shí)創(chuàng)建此對(duì)象。代碼如下:

class Singleton

    {

        private static Singleton _instance;

       

        private Singleton(){}

 

        public static Singleton f_Instance

        {

            get

            {

                if(_instance == null)

                {

                    _instance = new Singleton();

                }

                return _instance;

            }

        }

    }

我在main函數(shù)中寫(xiě)入如下程序來(lái)查看一下這樣寫(xiě)是否有效:

static void Main(string[] args)

        {

            Singleton t1 = Singleton.f_Instance;

            Singleton t2 = Singleton.f_Instance;

            Console.Write(object.ReferenceEquals(t1,t2));

            Console.Read();

        }

控制臺(tái)顯示為True,開(kāi)來(lái)還是有效的。當(dāng)然在Main中我也試過(guò)這樣寫(xiě):Singleton t1 = new Singleton(),編譯時(shí)告訴我Singleton()不可訪問(wèn)(當(dāng)然,人家是私有的,不是自家人當(dāng)然不見(jiàn))

這種單線(xiàn)程下的單件模式有幾點(diǎn)要注意:

1、  構(gòu)造器私有化(如果要此類(lèi)被繼承,可以用protected聲明構(gòu)造器)

2、  不要支持IClinieable接口,因?yàn)闀?huì)導(dǎo)致多個(gè)對(duì)象實(shí)例的出現(xiàn)

3、  不能支持序列化

4、  單件模式只考慮了對(duì)象創(chuàng)建的管理,沒(méi)有考慮對(duì)象的銷(xiāo)毀管理(創(chuàng)建自己的對(duì)象,銷(xiāo)毀的事交給垃圾回收器吧)

5、  不能應(yīng)對(duì)多線(xiàn)程環(huán)境,因?yàn)闀?huì)導(dǎo)致多個(gè)對(duì)象實(shí)例的出現(xiàn)

那在多線(xiàn)程下如何實(shí)現(xiàn)呢?代碼如下:

class SingletonMuli//多線(xiàn)程Singleton模式

    {

        private static volatile SingletonMuli _instance;    //volatile是為了讓編譯器對(duì)此代碼編譯后的位置不進(jìn)行調(diào)整

        private SingletonMuli(){}

        private static object lockHelper = new object();    //輔助器,不參與對(duì)象構(gòu)建

        public static SingletonMuli f_Instance

        {

            get

            {

                if(_instance == null)

                {

                    lock(lockHelper)

                    {

                        if(_instance == null)       //雙檢查

                        {

                            _instance = new SingletonMuli();

                        }

                    }

                }

                return _instance;

            }

        }

    }

當(dāng)然還有一些更簡(jiǎn)單的實(shí)現(xiàn)方法,如:

    class Singleton1//可以用在多線(xiàn)程環(huán)境

    {

        public static readonly Singleton1 _instance = new Singleton1();

        private Singleton1(){}

    }

其中要提到的是在_instance私有字段的實(shí)例化叫做“內(nèi)聯(lián)初始化”。內(nèi)聯(lián)初始化是指在聲明時(shí)。

實(shí)際上面的代碼上相當(dāng)于如下代碼:

Public static readonly Singleton1 _instance;

Static Singleton()  //靜態(tài)構(gòu)造函數(shù)

{

    _instance = new Singleton();        //私有構(gòu)造器

}

Private Singleton(){}

內(nèi)聯(lián)初始化時(shí)會(huì)先執(zhí)行靜態(tài)構(gòu)造器,如果沒(méi)有靜態(tài)構(gòu)造函數(shù),系統(tǒng)會(huì)默認(rèn)一個(gè)。在訪問(wèn)此靜態(tài)字段時(shí)執(zhí)行靜態(tài)構(gòu)造器生成。靜態(tài)構(gòu)造器保證了在多線(xiàn)程時(shí)只有一個(gè)線(xiàn)程執(zhí)行,自動(dòng)加鎖。

當(dāng)然,第二種實(shí)現(xiàn)方式也有一些缺點(diǎn),如:靜態(tài)構(gòu)造器必須是私有的、無(wú)參的。不過(guò)也可以用其他的方式解決這類(lèi)問(wèn)題。如可以用方法屬性實(shí)現(xiàn)擴(kuò)展或修改私有構(gòu)造器。

現(xiàn)在我們可以回來(lái)看看我開(kāi)始說(shuō)的那兩個(gè)Form的問(wèn)題,我們現(xiàn)在可以這樣實(shí)現(xiàn):

        private static Form2 form;

 

        private void button1_Click(object sender, System.EventArgs e)

        {

            Thread.Sleep(10000);

            object lockhelp = new object();

            if(form == null)

            {

                lock(lockhelp)

                {

                    if(form == null)

                    {

                        form = new Form2();

                        form.Show();

                    }

                }

            }

            this.Hide();

        }

這樣問(wèn)題就解決了(我是沒(méi)有點(diǎn)出來(lái)第二個(gè)Form2,如果那位點(diǎn)出來(lái)了,給我發(fā)Email,我請(qǐng)她/他在天津的烤鴨)

單件模式實(shí)際上是利用控制對(duì)象創(chuàng)造過(guò)程來(lái)控制對(duì)象的創(chuàng)造個(gè)數(shù)的方法,我們可以對(duì)其進(jìn)行擴(kuò)展,不是讓他只生成一個(gè)對(duì)象,可以讓他只生成幾個(gè)對(duì)象,這樣可以實(shí)現(xiàn)對(duì)象池。

單件模式的核心是:如何控制用戶(hù)使用new對(duì)一個(gè)類(lèi)的實(shí)例構(gòu)造器的任意調(diào)用。

 

posted on 2006-04-16 17:04 KiddLee 閱讀(1623) 評(píng)論(18)  編輯 收藏 引用 網(wǎng)摘 所屬分類(lèi): 設(shè)計(jì)模式

FeedBack:
# 
private static object lockHelper = new object();
你知道為什么要這樣寫(xiě)嗎?

而且,能顯示兩個(gè)窗體,正是EventHandler注冊(cè)了多個(gè)委托實(shí)例的原因,
你修改后的button1_Click也并不是單件模式的應(yīng)用.  回復(fù)  更多評(píng)論
  
# re: 設(shè)計(jì)模式學(xué)習(xí)筆記(二)——Singleton單件模式 2006-04-16 18:12 Dflying Chen
我也看不懂您的例子中Singleton的實(shí)現(xiàn)。  回復(fù)  更多評(píng)論
  
# re: 設(shè)計(jì)模式學(xué)習(xí)筆記(二)——Singleton單件模式 2006-04-16 23:05 bisou.cn
剛 開(kāi)始看設(shè)計(jì)模式,有個(gè)疑問(wèn) 就是Singleton和不用Singleton模式的類(lèi)有什么區(qū)別?就是一個(gè)能夠保證一個(gè)實(shí)例,一個(gè)不能保證嗎?如果這樣的話(huà)大多類(lèi)不都可以用這種形式 來(lái)做?除了一些特殊情況外?可為什么我看別人的代碼還是充斥著許多new呢?是他們不會(huì)用還是其他??
望賜教  回復(fù)  更多評(píng)論
  
# re: 設(shè)計(jì)模式學(xué)習(xí)筆記(二)——Singleton單件模式 2006-04-17 08:39 Terrylee
@bisou.cn
并不是大多數(shù)類(lèi)都要用Singleton模式的,應(yīng)該是大多數(shù)類(lèi)都不用的,而只是那些少數(shù)資源比較昂貴的類(lèi)才會(huì)用!  回復(fù)  更多評(píng)論
  
# re: 設(shè)計(jì)模式學(xué)習(xí)筆記(二)——Singleton單件模式 2006-04-17 08:51 kid_li
@aaaaaaa
修改后的代碼我沒(méi)有拷貝完全,private static object lockHelper = new object(); 這句代碼聲明了一個(gè)輔助器,這是在下面為了鎖住資源使用的。出現(xiàn)兩個(gè)窗體是因?yàn)樵诔绦蜻\(yùn)行時(shí)點(diǎn)擊了兩次Button1。我對(duì)Form程序的修改是按照多線(xiàn) 程單件模式的代碼事例寫(xiě)的。  回復(fù)  更多評(píng)論
  
# re: 設(shè)計(jì)模式學(xué)習(xí)筆記(二)——Singleton單件模式 2006-04-17 08:57 kid_li
@Dflying Chen
單件模式本質(zhì)就是控制對(duì)象的構(gòu)建,如果你把對(duì)象構(gòu)建的方法給了類(lèi)的使用者,你就無(wú)法控制類(lèi)對(duì)象的構(gòu)建個(gè)數(shù),要控制類(lèi)對(duì)象的構(gòu)建個(gè)數(shù),就要自己掌握類(lèi)的構(gòu)建方法,類(lèi)的構(gòu)建方法不被其他類(lèi)使用者使用,所以,類(lèi)的構(gòu)建方法私有化可以達(dá)到限制的目的  回復(fù)  更多評(píng)論
  
# re: 設(shè)計(jì)模式學(xué)習(xí)筆記(二)——Singleton單件模式 2006-04-17 09:03 kid_li
@bisou.cn
設(shè)計(jì)模式是一種思想,他也在不斷的擴(kuò)展,正像我后面說(shuō)的對(duì)象池,他就可以認(rèn)為是一種單件模式的擴(kuò)展。我有時(shí)間的話(huà)會(huì)再寫(xiě)一篇利用單件模式的思想或擴(kuò)展來(lái)實(shí)現(xiàn)對(duì)象池的代碼。有時(shí)間的話(huà),請(qǐng)多多關(guān)注,多提意見(jiàn)  回復(fù)  更多評(píng)論
  
# re: 設(shè)計(jì)模式學(xué)習(xí)筆記(二)——Singleton單件模式 2006-04-17 09:16 Dflying Chen
@kid_li
您的代碼里還在用form = new Form2();
不也是調(diào)用了公有構(gòu)造函數(shù)??
難道在外面加了幾個(gè)lock就是Singleton?
您的例子只能說(shuō)是您在Form1中以Singleton的方式使用了Form2,而不能說(shuō)Form2實(shí)現(xiàn)了Singleton模式………………
如果真的使用了Singleton,應(yīng)該寫(xiě)form = Form2.Instance;才對(duì)…………  回復(fù)  更多評(píng)論
  
# re: 設(shè)計(jì)模式學(xué)習(xí)筆記(二)——Singleton單件模式 2006-04-17 12:03 kid_li
@Dflying Chen
設(shè)計(jì)模式是思想,而不是固定的代碼片斷,使用設(shè)計(jì)模式是為了解決問(wèn)題,而不是為了使用設(shè)計(jì)模式而使用設(shè)計(jì)模式。單件模式的實(shí)現(xiàn)也不是就我上面寫(xiě)的 那幾種。有很多種寫(xiě)法。而且這種思想本身也在發(fā)展。就我上面寫(xiě)的那段WinForm的程序,我不用非要說(shuō)明這是單件模式,我只想實(shí)現(xiàn)我的功能就可以。
TerryLee曾和我說(shuō):設(shè)計(jì)模式就像打太極拳,要融會(huì)貫通,而不是循規(guī)蹈矩,當(dāng)然很高興你跟我討論這個(gè)問(wèn)題,不知這樣的解釋你是否滿(mǎn)意  回復(fù)  更多評(píng)論
  
# re: 設(shè)計(jì)模式學(xué)習(xí)筆記(二)——Singleton單件模式 2006-04-17 14:54 henry
(我是沒(méi)有點(diǎn)出來(lái)第二個(gè)Form2,如果那位點(diǎn)出來(lái)了,給我發(fā)Email,我請(qǐng)她/他在天津的烤鴨)
針對(duì)這個(gè)功能的情況是沒(méi)問(wèn)題的,因?yàn)闊o(wú)論你如何點(diǎn)擊或快速都是基于單線(xiàn)程操作,并沒(méi)有出現(xiàn)并發(fā)的情況.
如果樓主沒(méi)有修改代碼的情況,那代碼應(yīng)該不是線(xiàn)程安全的.
  回復(fù)  更多評(píng)論
  
# re: 設(shè)計(jì)模式學(xué)習(xí)筆記(二)——Singleton單件模式 2006-04-17 16:02 bisou.cn
@Terrylee

按照你說(shuō)的“只有少數(shù)資源比較昂貴的類(lèi)才會(huì)用”的話(huà),我就更不明白了,既然Singleton模式有這么多好處,比如可以減少資源的浪費(fèi)和代碼輸入量的減少,為什么不只要能用的地方都用呢?這樣不是更好嗎?

望 賜教! 其實(shí)就是這個(gè)問(wèn)題我搞不懂,難道這個(gè)模式還是有缺點(diǎn)的(當(dāng)然我是指在能用的情況下)  回復(fù)  更多評(píng)論
  
# re: 設(shè)計(jì)模式學(xué)習(xí)筆記(二)——Singleton單件模式 2006-04-17 16:05 bisou.cn
順便說(shuō)一下,我看到好多講 Singleton單件模式 的時(shí)候 都會(huì)用到樓主以上的例子,包括微軟msdn上面的WebCast系列講座,但是每篇發(fā)表出來(lái)的blog都有人在下面質(zhì)疑代碼!不知道到底這段代碼有什么問(wèn)題  回復(fù)  更多評(píng)論
  
# re: 設(shè)計(jì)模式學(xué)習(xí)筆記(二)——Singleton單件模式 2006-04-17 16:36 Terrylee
@bisou.cn
一下問(wèn)這么多問(wèn)題啊,呵呵,我慢慢來(lái)解釋吧:)
1.“只有少數(shù)資源比較昂貴的類(lèi)才會(huì)用”比如說(shuō)NHibernate中的ISession實(shí)例,如果說(shuō)再多線(xiàn)程情況下都去ISession實(shí)例的話(huà),開(kāi)銷(xiāo)會(huì)非常之大,所以這里就要使用Singleton模式。
我一再說(shuō)的是并不是所有的類(lèi)都要用Singleton模式,比如說(shuō)實(shí)體類(lèi),就無(wú)法使用。

2.關(guān)于模式的優(yōu)缺點(diǎn)問(wèn)題,可以說(shuō)一句,設(shè)計(jì)模式是為了靈活性和擴(kuò)展性、可維護(hù)性而存在的,并不是為了提高性能,相反是犧牲了性能來(lái)?yè)Q取靈活性。 Singleton模式也有它自身的缺點(diǎn),實(shí)例數(shù)量雖然減少了每次對(duì)象請(qǐng)求引用時(shí)都要檢查是否存在類(lèi)的實(shí)例,還是需要一些開(kāi)銷(xiāo),所以這就是需要一個(gè)權(quán)衡的 過(guò)程!

3.你說(shuō)的那段代碼是指下面這段嗎?
======================================================
class Singleton
{
private static Singleton _instance;

private Singleton(){}

public static Singleton f_Instance
{
get
{
if(_instance == null)
{
_instance = new Singleton();
}
return _instance;
}
}
}
====================================================
這段代碼是Single模式的一個(gè)簡(jiǎn)單實(shí)現(xiàn),在單線(xiàn)程下是沒(méi)有問(wèn)題的,但是如果是多線(xiàn)程,就會(huì)造成可能創(chuàng)建的實(shí)例不是一個(gè),會(huì)有并發(fā)操作的問(wèn)題,更多細(xì)節(jié)可以參考我寫(xiě)的設(shè)計(jì)模式的文章:
http://terrylee.cnblogs.com/archive/2005/12/09/293509.html

4.還有一點(diǎn),Singleton模式減少代碼輸入量的優(yōu)點(diǎn)從何談起呢?這一點(diǎn)我沒(méi)這樣說(shuō)過(guò),也沒(méi)體會(huì)到它會(huì)減少代碼輸入量。

最后,個(gè)人認(rèn)為Singleton模式僅僅是提供了保證類(lèi)只有一個(gè)實(shí)例的這樣一種機(jī)制!具體使用那種實(shí)現(xiàn)方法,根據(jù)具體情況來(lái)定。比如說(shuō)有人說(shuō) Doubl-Check有缺點(diǎn),不能使用,但事實(shí)上在某些情況下還是可以使用,下面這段代碼出自于Enterprise Library2.0中:
private static object sync = new object();
private static volatile LogWriter writer;
//得到創(chuàng)建LogWriter的工廠實(shí)例
private static LogWriterFactory factory = new LogWriterFactory(ConfigurationSourceFactory.Create());

public static LogWriter Writer
{
get
{
if (writer == null)
{
lock (sync)
{
if (writer == null)
{
try
{
//得到LogWriter對(duì)象
writer = factory.Create();
}
catch (ConfigurationErrorsException configurationException)
{
TryLogConfigurationFailure(configurationException);

throw;
}
}
}
}
return writer;
}
}  回復(fù)  更多評(píng)論
  
# re: 設(shè)計(jì)模式學(xué)習(xí)筆記(二)——Singleton單件模式 2006-04-17 17:31 henry
模式本身是沒(méi)問(wèn)題, 但在什么情況下如何實(shí)現(xiàn)是存在差別的.
最常見(jiàn)的就是單線(xiàn)程和多線(xiàn)程下的處理,如果對(duì)這些問(wèn)題沒(méi)有搞清楚的情況下使用是很危險(xiǎn)的.
如果我沒(méi)看錯(cuò)源碼的情況下NHibernate中的ISession應(yīng)該不是采用單件模創(chuàng)建的.
  回復(fù)  更多評(píng)論
  
# re: 設(shè)計(jì)模式學(xué)習(xí)筆記(二)——Singleton單件模式 2006-04-17 17:42 Terrylee
@henry
暈,可能是我沒(méi)有說(shuō)清楚,NHibernate源碼中的ISession是沒(méi)有用Singleton模式,我的意思是在我們自己創(chuàng)建ISession實(shí)例時(shí),難道你也不用Singleton模式??
  回復(fù)  更多評(píng)論
  
# re: 設(shè)計(jì)模式學(xué)習(xí)筆記(二)——Singleton單件模式 2006-04-17 18:06 henry
@Terrylee
SessionFactory我往往是采有單件模式保存.
而ISession那看情況來(lái)定的,在Win下我通常會(huì)采用Singleton模式,但在web下我就不會(huì)選擇Singleton模式的.
模式這東西我還是覺(jué)得在代碼重構(gòu)過(guò)程中掌握會(huì)有更多的收益.  回復(fù)  更多評(píng)論
  
# re: 設(shè)計(jì)模式學(xué)習(xí)筆記(二)——Singleton單件模式 2006-04-18 09:13 bisou.cn
@Terrylee

上文上的代碼輸入的減少我是指
不用每個(gè)地方都需要Class1 class=new Class1()這樣寫(xiě)了,后來(lái)想想確實(shí)沒(méi)有代碼量輸入的減少,呵呵

因?yàn)槲沂亲鰓eb的,基本上都是單線(xiàn)程,不用考慮多線(xiàn)程。所以說(shuō)如果能用的我覺(jué)得都應(yīng)該用。
我想當(dāng)然的覺(jué)得“每次對(duì)象請(qǐng)求引用時(shí)都要檢查是否存在類(lèi)的實(shí)例”,比每次new一個(gè)實(shí)例應(yīng)該對(duì)系統(tǒng)開(kāi)銷(xiāo)要小的多! 當(dāng)然我是想當(dāng)然的,沒(méi)有試驗(yàn)過(guò) 不知道對(duì)不對(duì)


代碼質(zhì)疑的是 Doubl-Check 這塊,我本以為微軟提供的webcast應(yīng)該不會(huì)有什么問(wèn)題的,呵呵
  回復(fù)  更多評(píng)論
  
# re: 設(shè)計(jì)模式學(xué)習(xí)筆記(二)——Singleton單件模式 2006-04-18 10:33 Terrylee
@henry,@bisou.cn
從重構(gòu)到模式是最好的使用設(shè)計(jì)模式的方法!

我想這個(gè)問(wèn)題的討論該結(jié)束了,再討論下去就會(huì)有人說(shuō)我們無(wú)聊了,哈哈:-)

這次的討論很愉快,以后多多交流!

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多