亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++設(shè)計模式之享元模式

2020-05-23 14:20:41
字體:
供稿:網(wǎng)友

前言

無聊的時候,也去QQ游戲大廳玩五子棋或者象棋;作為程序員,看到一個產(chǎn)品,總要去想想它是怎么設(shè)計的,怎么完成的,我想這個是所有程序員都會做的事情吧(強迫癥???)。有的時候,想完了,還要做一個DEMO出來,才能體現(xiàn)自己的NB,然后還有點小成就感。

在玩五子棋或象棋的時候,我就想過,騰訊那幫伙計是怎么做的呢?五子棋的棋子有黑白兩色,難道每次放一個棋子就new一個對象么?象棋有車、馬、相、士、帥、炮和兵,是不是每盤棋都要把所有的棋子都new出來呢?如果真的是每一個棋子都new一個,那么再加上那么多人玩;那要new多少對象啊,如果是這樣做的話,我想有多少服務(wù)器都是搞不定的,可能QQ游戲大廳會比12306還糟糕。那騰訊那幫伙計是如何實現(xiàn)的呢?那就要說到今天總結(jié)的享元模式了。

什么是享元模式?

在GOF的《設(shè)計模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》一書中對享元模式是這樣說的:運用共享技術(shù)有效地支持大量細(xì)粒度的對象。

就如上面說的棋子,如果每個棋子都new一個對象,就會存在大量細(xì)粒度的棋子對象,這對服務(wù)器的內(nèi)存空間是一種考驗,也是一種浪費。我們都知道,比如我在2013號房間和別人下五子棋,2014號房間也有人在下五子棋,并不會因為我在2013號房間,而別人在2014號房間,而導(dǎo)致我們的棋子是不一樣的。這就是說,2013號房間和2014號房間的棋子都是一樣的,所有的五子棋房間的棋子都是一樣的。唯一的不同是每個棋子在不同的房間的不同棋盤的不同位置上。所以,對于棋子來說,我們不用放一個棋子就new一個棋子對象,只需要在需要的時候,去請求獲得對應(yīng)的棋子對象,如果沒有,就new一個棋子對象;如果有了,就直接返回棋子對象。這里以五子棋為例子,進(jìn)行分析,當(dāng)玩家在棋盤上放入第一個白色棋子時,此時由于沒有白色棋子,所以就new一個白色棋子;當(dāng)另一個玩家放入第一個黑色棋子時,此時由于沒有黑色棋子,所以就需要new一個黑色棋子;當(dāng)玩家再次放入一個白色棋子時,就去查詢是否有已經(jīng)存在的白色棋子對象,由于第一次已經(jīng)new了一個白色棋子對象,所以,現(xiàn)在不會再次new一個白色棋子對象,而是返回以前new的白色棋子對象;對于黑色棋子,亦是同理;獲得了棋子對象,我們只需要設(shè)置棋子的不同棋盤位置即可。

UML類圖

C++設(shè)計模式之享元模式

Flyweight:描述一個接口,通過這個接口flyweight可以接受并作用于外部狀態(tài);

ConcreteFlyweight:實現(xiàn)Flyweight接口,并為定義了一些內(nèi)部狀態(tài),ConcreteFlyweight對象必須是可共享的;同時,它所存儲的狀態(tài)必須是內(nèi)部的;即,它必須獨立于ConcreteFlyweight對象的場景;

UnsharedConcreteFlyweight:并非所有的Flyweight子類都需要被共享。Flyweight接口使共享成為可能,但它并不強制共享。

FlyweightFactory:創(chuàng)建并管理flyweight對象。它需要確保合理地共享flyweight;當(dāng)用戶請求一個flyweight時,F(xiàn)lyweightFactory對象提供一個已創(chuàng)建的實例,如果請求的實例不存在的情況下,就新創(chuàng)建一個實例;

Client:維持一個對flyweight的引用;同時,它需要計算或存儲flyweight的外部狀態(tài)。

實現(xiàn)要點

根據(jù)我們的經(jīng)驗,當(dāng)要將一個對象進(jìn)行共享時,就需要考慮到對象的狀態(tài)問題了;不同的客戶端獲得共享的對象之后,可能會修改共享對象的某些狀態(tài);大家都修改了共享對象的狀態(tài),那么就會出現(xiàn)對象狀態(tài)的紊亂。對于享元模式,在實現(xiàn)時一定要考慮到共享對象的狀態(tài)問題。那么享元模式是如何實現(xiàn)的呢?

在享元模式中,有兩個非常重要的概念:內(nèi)部狀態(tài)和外部狀態(tài)。

內(nèi)部狀態(tài)存儲于flyweight中,它包含了獨立于flyweight場景的信息,這些信息使得flyweight可以被共享。而外部狀態(tài)取決于flyweight場景,并根據(jù)場景而變化,因此不可共享。用戶對象負(fù)責(zé)在必要的時候?qū)⑼獠繝顟B(tài)傳遞給flyweight。

flyweight執(zhí)行時所需的狀態(tài)必定是內(nèi)部的或外部的。內(nèi)部狀態(tài)存儲于ConcreteFlyweight對象之中;而外部對象則由Client對象存儲或計算。當(dāng)用戶調(diào)用flyweight對象的操作時,將該狀態(tài)傳遞給它。同時,用戶不應(yīng)該直接對ConcreteFlyweight類進(jìn)行實例化,而只能從FlyweightFactory對象得到ConcreteFlyweight對象,這可以保證對它們適當(dāng)?shù)剡M(jìn)行共享;由于共享一個實例,所以在創(chuàng)建這個實例時,就可以考慮使用單例模式來進(jìn)行實現(xiàn)。

享元模式的工廠類維護(hù)了一個實例列表,這個列表中保存了所有的共享實例;當(dāng)用戶從享元模式的工廠類請求共享對象時,首先查詢這個實例表,如果不存在對應(yīng)實例,則創(chuàng)建一個;如果存在,則直接返回對應(yīng)的實例。

代碼實現(xiàn):

 

復(fù)制代碼代碼如下:

#include <iostream>
#include <map>
#include <vector>
using namespace std;
 
typedef struct pointTag
{
    int x;
    int y;
 
    pointTag(){}
    pointTag(int a, int b)
    {
        x = a;
        y = b;
    }
 
     bool operator <(const pointTag& other) const
     {
         if (x < other.x)
         {
             return true;
         }
         else if (x == other.x)
         {
             return y < other.y;
         }
 
         return false;
     }
}POINT;
 
typedef enum PieceColorTag
{
    BLACK,
    WHITE
}PIECECOLOR;
 
class CPiece
{
public:
    CPiece(PIECECOLOR color) : m_color(color){}
    PIECECOLOR GetColor() { return m_color; }
 
    // Set the external state
    void SetPoint(POINT point) { m_point = point; }
    POINT GetPoint() { return m_point; }
 
protected:
    // Internal state
    PIECECOLOR m_color;
 
    // external state
    POINT m_point;
};
 
class CGomoku : public CPiece
{
public:
    CGomoku(PIECECOLOR color) : CPiece(color){}
};
 
class CPieceFactory
{
public:
    CPiece *GetPiece(PIECECOLOR color)
    {
        CPiece *pPiece = NULL;
        if (m_vecPiece.empty())
        {
            pPiece = new CGomoku(color);
            m_vecPiece.push_back(pPiece);
        }
        else
        {
            bool bFound = false; // 非常感謝fireace指出的問題
            for (vector<CPiece *>::iterator it = m_vecPiece.begin(); it != m_vecPiece.end(); ++it)
            {
                if ((*it)->GetColor() == color)
                {
                    bFound = true;
                    pPiece = *it;
                    break;
                }
                bFound = false;
            }
            if (!bFound)
            {
                pPiece = new CGomoku(color);
                m_vecPiece.push_back(pPiece);
            }
        }
        return pPiece;
    }
 
    ~CPieceFactory()
    {
        for (vector<CPiece *>::iterator it = m_vecPiece.begin(); it != m_vecPiece.end(); ++it)
        {
            if (*it != NULL)
            {
                delete *it;
                *it = NULL;
            }
        }
    }
 
private:
    vector<CPiece *> m_vecPiece;
};
 
class CChessboard
{
public:
    void Draw(CPiece *piece)
    {
        if (piece->GetColor())
        {
            cout<<"Draw a White"<<" at ("<<piece->GetPoint().x<<","<<piece->GetPoint().y<<")"<<endl;
        }
        else
        {
            cout<<"Draw a Black"<<" at ("<<piece->GetPoint().x<<","<<piece->GetPoint().y<<")"<<endl;
        }
        m_mapPieces.insert(pair<POINT, CPiece *>(piece->GetPoint(), piece));
    }
 
    void ShowAllPieces()
    {
        for (map<POINT, CPiece *>::iterator it = m_mapPieces.begin(); it != m_mapPieces.end(); ++it)
        {
            if (it->second->GetColor())
            {
                cout<<"("<<it->first.x<<","<<it->first.y<<") has a White chese."<<endl;
            }
            else
            {
                cout<<"("<<it->first.x<<","<<it->first.y<<") has a Black chese."<<endl;
            }
        }
    }
 
private:
    map<POINT, CPiece *> m_mapPieces;
};
 
int main()
{
    CPieceFactory *pPieceFactory = new CPieceFactory();
    CChessboard *pCheseboard = new CChessboard();
 
    // The player1 get a white piece from the pieces bowl
    CPiece *pPiece = pPieceFactory->GetPiece(WHITE);
    pPiece->SetPoint(POINT(2, 3));
    pCheseboard->Draw(pPiece);
 
    // The player2 get a black piece from the pieces bowl
    pPiece = pPieceFactory->GetPiece(BLACK);
    pPiece->SetPoint(POINT(4, 5));
    pCheseboard->Draw(pPiece);
 
    // The player1 get a white piece from the pieces bowl
    pPiece = pPieceFactory->GetPiece(WHITE);
    pPiece->SetPoint(POINT(2, 4));
    pCheseboard->Draw(pPiece);
 
    // The player2 get a black piece from the pieces bowl
    pPiece = pPieceFactory->GetPiece(BLACK);
    pPiece->SetPoint(POINT(3, 5));
    pCheseboard->Draw(pPiece);
 
    /*......*/
 
    //Show all cheses
    cout<<"Show all cheses"<<endl;
    pCheseboard->ShowAllPieces();
 
    if (pCheseboard != NULL)
    {
        delete pCheseboard;
        pCheseboard = NULL;
    }
    if (pPieceFactory != NULL)
    {
        delete pPieceFactory;
        pPieceFactory = NULL;
    }
}

 

內(nèi)部狀態(tài)包括棋子的顏色,外部狀態(tài)包括棋子在棋盤上的位置。最終,我們省去了多個實例對象存儲棋子顏色的空間,從而達(dá)到了空間的節(jié)約。

在上面的代碼中,我建立了一個CCheseboard用于表示棋盤,棋盤類中保存了放置的黑色棋子和白色棋子;這就相當(dāng)于在外部保存了共享對象的外部狀態(tài);對于棋盤對象,我們是不是又可以使用享元模式呢?再設(shè)計一個棋局類進(jìn)行管理棋盤上的棋子布局,用來保存外部狀態(tài)。對于這個,這里不進(jìn)行討論了。

優(yōu)點

享元模式可以避免大量非常相似對象的開銷。在程序設(shè)計時,有時需要生成大量細(xì)粒度的類實例來表示數(shù)據(jù)。如果能發(fā)現(xiàn)這些實例數(shù)據(jù)除了幾個參數(shù)外基本都是相同的,使用享元模式就可以大幅度地減少對象的數(shù)量。

使用場合

Flyweight模式的有效性很大程度上取決于如何使用它以及在何處使用它。當(dāng)以下條件滿足時,我們就可以使用享元模式了。

1.一個應(yīng)用程序使用了大量的對象;
2.完全由于使用大量的對象,造成很大的存儲開銷;
3.對象的大多數(shù)狀態(tài)都可變?yōu)橥獠繝顟B(tài);
4.如果刪除對象的外部狀態(tài),那么可以用相對較少的共享對象取代很多組對象。

擴展

之前總結(jié)了組合模式組合模式,現(xiàn)在回過頭來看看,享元模式就好比在組合模式的基礎(chǔ)上加上了一個工廠類,進(jìn)行共享控制。是的,組合模式有的時候會產(chǎn)生很多細(xì)粒度的對象,很多時候,我們會將享元模式和組合模式進(jìn)行結(jié)合使用。

總結(jié)

使用享元模式可以避免大量相似對象的開銷,減小了空間消耗;而空間的消耗是由以下幾個因素決定的:

1.實例對象減少的數(shù)目;
2.對象內(nèi)部狀態(tài)的數(shù)目;對象內(nèi)部狀態(tài)越多,消耗的空間也會越少;
3.外部狀態(tài)是計算的還是存儲的;由于外部狀態(tài)可能需要存儲,如果外部狀態(tài)存儲起來,那么空間的節(jié)省就不會太多。

共享的Flyweight越多,存儲節(jié)約也就越多,節(jié)約量隨著共享狀態(tài)的增多而增大。當(dāng)對象使用大量的內(nèi)部及外部狀態(tài),并且外部狀態(tài)是計算出來的而非存儲的時候,節(jié)約量將達(dá)到最大。所以,可以使用兩種方法來節(jié)約存儲:用共享減少內(nèi)部狀態(tài)的消耗;用計算時間換取對外部狀態(tài)的存儲。

同時,在實現(xiàn)的時候,一定要控制好外部狀態(tài)與共享對象的對應(yīng)關(guān)系,比如我在代碼實現(xiàn)部分,在CCheseboard類中使用了一個map進(jìn)行彼此之間的映射,這個映射在實際開發(fā)中需要考慮的。

好了,享元模式就總結(jié)到這里了。希望大家和我分享你對設(shè)計模式的理解。我堅信:分享使我們更進(jìn)步。
PS:至于騰訊那幫伙計到底是如何實現(xiàn)QQ游戲大廳的,我也不知道,這里也完全是猜測的,請不要以此為基準(zhǔn)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
一区二区三区四区五区精品| 绯色av一区二区| 欧美久久一二三四区| 神马午夜精品91| 在线日韩av片| 欧美性猛交xxxxbbbb| 伪装者在线观看完整版免费| 尤物精品在线| 午夜影院在线观看国产主播| 色男人天堂综合再现| 国产在线观看一区二区| 欧美r级电影在线观看| 欧美+日本+国产+在线a∨观看| 美女国产一区二区| 亚洲人成在线播放| 欧美成人乱码一二三四区免费| 久久综合国产| 国产精品嫩草99a| 夜夜嗨网站十八久久| 日本亚州欧洲精品不卡| 日韩国产欧美一区二区三区| 久久久精品动漫| 亚洲xxxx2d动漫1| 久久理论电影网| 国精产品999国精产品官网| 日本一区二区综合亚洲| 先锋影音欧美四级| 欧美成人精品福利网站| 欧美一级片免费观看| 亚洲欧美日韩小说| 成人av激情人伦小说| 最新av在线播放| 一级女性全黄久久生活片免费| 一区二区三区成人精品| 国产精品久久久久久久久久尿| 中文在线免费看视频| 亚洲人成电影在线观看网| 美女网站视频久久| 日韩成人激情视频| 亚洲超碰97人人做人人爱| 日本精品一区二区在线观看| 年下总裁被打光屁股sp| 欧美三级午夜理伦三级中视频| 国产河南妇女毛片精品久久久| 亚洲女同一区| 69av影院| 搞av.com| 午夜伦理在线视频| 超碰在线公开免费| 美国一级黄色录像| 日本系列欧美系列| 亚洲91精品在线| 一本久道久久综合狠狠爱| 国产午夜精品一区二区三区四区| 日韩中文字幕区一区有砖一区| 国产成人亚洲综合色影视| 亚洲一二三四2021不卡| 欧美黄色网页| 国产三区视频在线观看| 国产精品久久久久久久蜜臀| 精品国产成人在线| 久久精品国产99久久| 久久亚洲春色中文字幕久久久| 成人在线一级片| 日韩欧美亚洲一区二区| 欧美国产专区| 操人视频在线观看欧美| 黄色影视在线观看| 国产精品美女在线观看直播| 日韩在线免费视频| 国产免费一区二区三区四区| 视频一区中文字幕国产| 国产午夜精品久久久久久久久| 五月婷婷综合在线观看| 91免费电影网站| 亚洲一二三精品| 在线国产精品一区| 18禁男女爽爽爽午夜网站免费| 国产精品一二三区在线观看| 日韩中文字幕在线播放| 久久久另类综合| 成人性生交大片免费看中文视频| 亚洲 欧美 变态 另类 综合| 自拍偷拍欧美亚洲| 国产精品中文字幕欧美| 精品产品国产在线不卡| 国产精品高清一区二区| 领导边摸边吃奶边做爽在线观看| 激情小说亚洲图片| 五月婷婷狠狠干| 一区二区在线电影| 色姑娘资源站| 一道精品视频一区二区三区图片| 日韩精品一区二区三区在线| 亚洲一级爰片777777| 精品久久国产一区| 久久亚洲国产精品日日av夜夜| 亚洲一区二区三区三州| 亚洲自拍偷拍图| 国产精欧美一区二区三区白种人| 性の欲びの女javhd| 你懂的在线观看一区二区| 91大片在线观看| 91精品国产自产精品男人的天堂| 国产一级片麻豆| 69堂精品视频| 97成人精品区在线播放| 亚洲 国产 欧美一区| 免费观看成人毛片| 日韩不卡av在线| 成人3d漫画免费无遮挡软件| 妺妺窝人体色www在线小说| 亚洲AV无码久久精品国产一区| 青青a在线精品免费观看| 精品成人一区| 国产精品久久久久秋霞鲁丝| 久久这里只有精品视频首页| 免费视频爱爱太爽了| 中文在线播放一区二区| 欧美激情精品久久久久久小说| 欧美少妇一区二区| 成人影院在线播放| 天天爽人人爽夜夜爽| 国产男人搡女人免费视频| 久久性色av| 91麻豆国产福利在线观看| 成人精品aaaa网站| 青青草精品视频在线观看| 久久夜色邦福利网| 污污的视频免费观看| 国产一区在线免费观看| 国产一区视频导航| 中文乱码字幕高清在线观看| 91精品久久久久久久久青青| yourporn在线观看视频| 精品视频在线观看一区二区| 亚洲不卡av不卡一区二区| 日韩啪啪电影网| 日韩欧国产精品一区综合无码| 欧美精品123区| 精品国产乱子伦一区二区| 久久久999成人| 国产一级做a爰片久久毛片男| 在线观看免费看片| av中文资源在线资源免费观看| 欧美一级淫片aaaaaaa视频| 你懂的国产视频| 18久久久久久| 免费99热在线观看| 国产 欧美 精品| 亚洲午夜影视影院在线观看| 肉色超薄丝袜脚交| 国产成人高清在线| 韩日欧美一区二区| 99国内精品久久久久久久| 国产精品成人自拍| 亚洲线精品一区二区三区| 久久久久久国产精品免费播放| 久久中文欧美| 国产传媒欧美日韩成人精品大片| 国产精品视频一区二区三区四蜜臂| 日韩一二三区不卡在线视频| 日韩毛片高清在线播放| 第四色亚洲色图| 欧美日韩电影在线| 亚洲精品网站在线| 亚洲精品日韩av| 欧美性受ⅹ╳╳╳黑人a性爽| 久久国产福利| 中文字幕久热精品视频在线| 97影院秋霞午夜在线观看| 日韩在线网址| 亚洲欧美一区二区三区久本道91| 精品国产伦一区二区三| 99视频网站| 国产在成人精品线拍偷自揄拍| 久久夜色精品国产亚洲aⅴ| 136国产福利精品导航网址| 日本免费观看网站| 一区二区免费av| 欧美成人免费在线视频| 免费黄色在线网站| 国产丝袜在线视频| 一级黄色片在线观看| 久久精品人人做| 成人av第一页| 特一级黄色录像| 久久精品国产秦先生| 丰满少妇在线观看网站| 性一交一乱一伧老太| 国产av 一区二区三区| 久久久久久久久久亚洲| 久久久国产成人精品| 亚洲自拍偷拍一区二区三区| av电影在线观看完整版一区二区| 国产高清视频色在线www| 91精品久久久久久9s密挑| 日本中文字幕高清视频| 桃乃木香奈av在线| xxxxx欧美| 中文字幕亚洲情99在线| 欧美丝袜第三区| 日韩伦理在线免费观看| 最新国产一区二区| av动漫精品一区二区| 国产乱码精品一区二区三区不卡| 亚洲一区二区三区四区五区午夜| 国产又爽又黄的视频| 久久久久无码精品国产| 在线欧美日韩精品| 国产午夜免费福利| 欧美日韩三级在线| 神宫寺奈绪一区二区三区| 一本久久a久久免费精品不卡| 色哟哟一区二区三区| 青青视频在线播放| 五月婷婷丁香激情| 日韩网站在线播放| 精品精品国产高清一毛片一天堂| 日韩精品中文字幕在线一区| 国产一区二区三区在线观看精品| 国产老妇另类xxxxx| 99国产精品白浆在线观看免费| 亚洲精品v日韩精品| 日韩不卡在线| 欧美理论电影在线播放| 夜夜爽www精品| 九色视频成人porny| 亚洲成a人v欧美综合天堂| 亚洲国产中文在线| 日韩精品无码一区二区三区久久久| 久久亚洲国产成人| 欧美另类69精品久久久久9999| 色阁综合伊人av| 中文字幕www| 久久午夜福利电影| 欧美在线免费观看亚洲| 日本欧美一区二区| 亚洲精品久久久久久下一站| 人妻有码中文字幕| 成人av免费在线看| 精品无码在线视频| 天堂中文在线资| 国产极品在线观看| 中文字幕免费高清视频| 久久人人爽人人爽人人| 久热中文字幕在线观看| 国产在线观看第一页| 天天干天天操天天做| 最近97中文超碰在线| 黄色网页大全| 日本熟伦人妇xxxx| 欧美唯美清纯偷拍| 欧美成人国产va精品日本一级| 99精品热6080yy久久| 成人综合久久| 国产美女性感在线观看懂色av| 99热6这里只有精品| 日韩精品在线免费看| 国产精品夜夜嗨| www.91av.com| 国产精华7777777| 国产欧美日韩精品高清二区综合区| 亚洲卡通欧美制服中文| 欧美一区二区三区爱爱| 天天色天天草| 久久免费黄色网址| 一本大道综合伊人精品热热| 超碰97人人射妻| 奇米影视一区二区三区小说| 日日骚一区二区网站| 免费看片黄色| 69av视频在线观看| 色狠狠久久aa北条麻妃| 国产资源第一页| 青青视频在线免费观看| 色偷偷综合社区| av在线播放国产| 日韩你懂的在线播放| 一区二区三区不卡在线| 久久久成人网| 亚洲大尺度在线观看| 亚洲狼人综合| 成人一区二区在线观看| 久久国产午夜精品理论片最新版本| 久久综合色88| 天天综合久久综合| 国产精品久久在线观看| 久久的精品视频| 欧美成人高潮一二区在线看| 国产中文在线| 日韩av在线第一页| 久久久久久福利| 九九热在线观看视频| 亚洲午夜免费| 国产97在线播放| 在线丝袜欧美日韩制服| 日本va欧美va精品发布| 粉嫩高清一区二区三区精品视频| 国产免费久久| 日韩中文字幕av在线| 五月香视频在线观看| 中文字幕一区二区精品区| 欧美日韩一区二区三区在线观看免| 日韩视频一区| 国产又大又黄又粗| 亚洲色图第四色| 亚洲国产精品久久精品怡红院| 天堂а√在线最新版中文在线| 国产午夜在线观看| 国色天香2019中文字幕在线观看| 国产露脸国语对白在线| 欧美白人做受xxxx视频| 色综合夜色一区| 日本三级2019| 亚洲国产日韩一区无码精品久久久| 男女午夜激情视频| 亚洲小少妇裸体bbw| 999国内精品视频在线| 亚洲精品成人av久久| 精品人妻一区二区三区免费| 青青草视频在线观看| 国产欧美日韩网站| 欧美色视频一区| 亚洲精品国产一区二区精华液| 日韩欧美国产高清91| 亚洲欧美激情另类校园| 97人摸人人澡人人人超一碰|