亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        觀察者模式在面向抽象編程中的應(yīng)用

        2016-09-10 08:23:42劉凌云
        關(guān)鍵詞:方法設(shè)計(jì)

        劉凌云

        (東北石油大學(xué)計(jì)算機(jī)與信息技術(shù)學(xué)院 大慶 163000)

        ?

        觀察者模式在面向抽象編程中的應(yīng)用

        劉凌云

        (東北石油大學(xué)計(jì)算機(jī)與信息技術(shù)學(xué)院大慶163000)

        為了提高軟件系統(tǒng)的可擴(kuò)展性和可維護(hù)性,在系統(tǒng)設(shè)計(jì)時(shí)必須搭建一個(gè)可以適應(yīng)用戶(hù)需求變化的系統(tǒng)框架,因此,在處理系統(tǒng)中對(duì)象間一對(duì)多的依賴(lài)關(guān)系時(shí),采用面向抽象的思維方式,引入觀察者模式,把變化部分從那些不變部分里分離出來(lái),形成抽象類(lèi)或接口,這樣,當(dāng)用戶(hù)需求發(fā)生變化時(shí),只需增添抽象類(lèi)或接口的實(shí)現(xiàn)類(lèi),而無(wú)需改變?cè)瓉?lái)的代碼,從而提高了系統(tǒng)的穩(wěn)健性,大大降低了軟件系統(tǒng)維護(hù)的成本。實(shí)踐證明,在項(xiàng)目設(shè)計(jì)中,具體抽象到哪一層可以結(jié)合各個(gè)開(kāi)發(fā)平臺(tái)的特性而做調(diào)整和優(yōu)化,并不是一成不變的。

        面向抽象編程; 觀察者模式; 抽象類(lèi); 接口; 事件; 委托

        Class NumberTP311

        1 引言

        在軟件的開(kāi)發(fā)過(guò)程中,雖然會(huì)拿出大量的時(shí)間來(lái)做需求分析,但是,用戶(hù)的需求不可能一成不變,既然無(wú)法控制變化,那么可以根據(jù)特定的場(chǎng)景,采用適當(dāng)?shù)脑O(shè)計(jì)模式,把變化部分從那些不變部分里分離出來(lái),形成抽象層,這樣當(dāng)用戶(hù)需求發(fā)生變化時(shí),就可以盡量地?cái)U(kuò)展原有的代碼,而減少對(duì)已有代碼的更改,來(lái)提高系統(tǒng)的可擴(kuò)展性和可維護(hù)性。

        2 面向抽象編程

        所謂面向抽象編程,是指當(dāng)設(shè)計(jì)一個(gè)類(lèi)時(shí),不讓該類(lèi)面向具體的類(lèi),而是面向抽象類(lèi)或接口,即所設(shè)計(jì)類(lèi)中的重要數(shù)據(jù)是抽象類(lèi)或接口聲明的變量,而不是具體類(lèi)聲明的變量[1]。

        面向抽象編程是附屬于面向?qū)ο笏枷塍w系,屬于其一部分。或者說(shuō),它是面向?qū)ο缶幊腆w系中的思想精髓之一,面向抽象編程可以更好地實(shí)現(xiàn)面向?qū)ο笠裱奈宕笾笇?dǎo)原則:單一職責(zé)原則:每一個(gè)類(lèi)應(yīng)該專(zhuān)注于做一件事情;開(kāi)閉原則:每一個(gè)類(lèi)應(yīng)該是對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉;里氏代換原則:避免造成派生類(lèi)的方法非法或退化,一個(gè)基類(lèi)的用戶(hù)應(yīng)當(dāng)不需要知道這個(gè)派生類(lèi);依賴(lài)倒轉(zhuǎn)原則:用依賴(lài)于接口和抽象類(lèi)來(lái)替代依賴(lài)容易變化的具體類(lèi);接口隔離原則:應(yīng)當(dāng)為客戶(hù)提供盡可能小的接口,而不是提供大的接口[2]。

        3 抽象類(lèi)和接口

        抽象類(lèi)和接口都是對(duì)業(yè)務(wù)邏輯的一種抽象,業(yè)務(wù)具體實(shí)現(xiàn)通過(guò)該接口或抽象類(lèi)的實(shí)現(xiàn)類(lèi)來(lái)完成,它們是對(duì)客戶(hù)端的一種承諾,是相對(duì)不變的[3]。當(dāng)需求發(fā)生變化時(shí),只需實(shí)現(xiàn)接口或者繼承抽象類(lèi)就可以擴(kuò)展新的功能。同時(shí)由于接口或者抽象類(lèi)沒(méi)有變化,因此依賴(lài)于該接口的客戶(hù)端類(lèi)代碼不需要進(jìn)行改變。這就很好地做到了對(duì)擴(kuò)展開(kāi)放、對(duì)修改關(guān)閉,減少對(duì)系統(tǒng)的影響。

        抽象類(lèi)往往用來(lái)表征對(duì)問(wèn)題領(lǐng)域進(jìn)行分析、設(shè)計(jì)中得出的抽象概念,是對(duì)一系列看上去不同,但是本質(zhì)上相同的具體概念的抽象[4];使用抽象類(lèi)是為了代碼的復(fù)用,它和子類(lèi)之間是一般和特殊的關(guān)系;而接口是設(shè)計(jì)時(shí)對(duì)外部設(shè)定的“契約”,體現(xiàn)了自然界“如果你是……則必須能……”的理念[5]。使用接口可以實(shí)現(xiàn)多態(tài),接口是它的子類(lèi)應(yīng)該實(shí)現(xiàn)的一組規(guī)則。

        4 觀察者模式

        4.1問(wèn)題描述

        某單位開(kāi)發(fā)一套航空訂票系統(tǒng),有如下場(chǎng)景:在系統(tǒng)收到顧客訂票支付現(xiàn)金的消息后,要馬上進(jìn)行數(shù)據(jù)庫(kù)記錄、系統(tǒng)日志記錄。

        對(duì)該場(chǎng)景進(jìn)行分析,對(duì)按照面向?qū)ο蟮乃枷?該場(chǎng)景里有顧客、訂單、數(shù)據(jù)庫(kù)三個(gè)類(lèi):類(lèi)圖如圖1所示。

        圖1 訂單支付類(lèi)圖

        在該類(lèi)圖設(shè)計(jì)中,對(duì)于用戶(hù)的上述場(chǎng)景我們完全可以滿(mǎn)足。但是隨著系統(tǒng)的運(yùn)行,要考慮到該場(chǎng)景可能加入其他的記錄操作或者通知操作:在系統(tǒng)收到顧客訂票支付現(xiàn)金的消息后,除了要馬上對(duì)數(shù)據(jù)庫(kù)操作外,可能還要添加發(fā)送信息通知用戶(hù),購(gòu)票送積分等其他記錄操作;能觸發(fā)用戶(hù)更改數(shù)據(jù)的操作,除了訂單被支付外,可能還會(huì)有別的通知操作(比如用戶(hù)改簽、飛機(jī)晚點(diǎn))。

        如果需求真的如上述所說(shuō)那樣變更,就得更改代碼:就要增加一個(gè)SMSOperator類(lèi),該類(lèi)里應(yīng)該有一個(gè)sendMessage()方法,這樣,就得修改Order類(lèi),再加一個(gè)List〈SMSOperator〉的變量,以及相關(guān)的添加取消方法,如果還有送積分操作,還得繼續(xù)修改,這樣,每添加一個(gè)記錄操作,就得修改類(lèi)中代碼,這不符合開(kāi)閉原則,為什么會(huì)導(dǎo)致這樣呢?

        因?yàn)樵谶@樣的設(shè)計(jì)中,Order類(lèi)和DBRecorder類(lèi)是雙向耦合的關(guān)系,也就是說(shuō)Order類(lèi)中有DBRecorder類(lèi)的實(shí)例,同樣DBRecorderOrder類(lèi)中有Order類(lèi)的實(shí)例;這樣設(shè)計(jì)的缺點(diǎn)就是:不論修改哪個(gè)類(lèi)中的代碼,另一個(gè)類(lèi)中的代碼都有可能要發(fā)生改變:比如就要在把Order類(lèi)重命名是FlightOder,就得更改DBRecorder中的代碼,同樣,如果把DBRecorder的updateData()方法重命名,同樣要更改Order中的代碼;不僅如此,客戶(hù)端也依賴(lài)具體的Order類(lèi)和DBRecoder類(lèi),這樣再更改的Order類(lèi)和DBRecoder類(lèi)的時(shí)候,同樣也需要更改客戶(hù)端的代碼;也就是說(shuō),這樣的設(shè)計(jì)模式并不能滿(mǎn)足需求的變化,對(duì)后期的維護(hù)非常不利。在這個(gè)設(shè)計(jì)的基礎(chǔ)上,既然通知操作和記錄操作都有可能發(fā)生變化,那么應(yīng)該把這些變化抽象出來(lái),形成抽象類(lèi)或者是接口,形成觀察者模式。

        4.2觀察者模式定義

        觀察者模式定義了對(duì)象間一種一對(duì)多的依賴(lài)關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽(tīng)某一個(gè)主題對(duì)象[5]。這個(gè)主題對(duì)象在狀態(tài)發(fā)生變化時(shí),會(huì)通知所有觀察者對(duì)象,使它們能夠自動(dòng)更新自己[6]。

        圖2 觀察者模式類(lèi)圖

        在該模式中,通過(guò)對(duì)多個(gè)通知操作和記錄操作的實(shí)例進(jìn)行抽象,制定好規(guī)范和契約,形成抽象類(lèi)和接口,抽象類(lèi)或接口只負(fù)責(zé)定義屬性和操作,把具體怎樣實(shí)現(xiàn)操作交給它們的實(shí)現(xiàn)類(lèi)去完成。從類(lèi)之間的關(guān)系上來(lái)說(shuō),客戶(hù)端依賴(lài)于抽象,具體的實(shí)現(xiàn)類(lèi)也依賴(lài)于抽象。依賴(lài)于抽象的優(yōu)點(diǎn)就是即使實(shí)現(xiàn)類(lèi)不斷變動(dòng),只要抽象不變,客戶(hù)程序就不需要變化,這大大降低了客戶(hù)程序與實(shí)現(xiàn)細(xì)節(jié)的耦合度[7],觀察者模式類(lèi)圖如圖2所示。

        將上述問(wèn)題場(chǎng)景按照觀察者模式進(jìn)行修改,為購(gòu)票對(duì)象添加紀(jì)錄觀察者:數(shù)據(jù)庫(kù)觀察者,短信觀察者。

        1) 抽象主題

        定義一個(gè)抽象類(lèi)ATicketSubject,規(guī)定具體主題需要繼承的三個(gè)抽象方法,用來(lái)添加、刪除觀察者及通知觀察者更新數(shù)據(jù)。主題接口ITicketObservable代碼如下:

        public abstract class ATicketSubject{

        private IList〈ITicketObserver〉 observers = new List〈ITicketObserver〉();

        public void ResisterObserver(ITicketObserver o){

        observers. Add (o) };

        public void UnResisterObserver(ITicketObserver o) {

        observers. Remove(o) };

        public void notifyObserver(){

        foreach (ITicketObserver o in observers) {o.Update();}}

        2) 抽象觀察者

        設(shè)計(jì)觀察者ITicketObserver接口:代碼如下:

        public interface ITicketObserver {

        public void Update(); }

        3) 具體主題FlightOrder

        具體主題類(lèi)FlightOrder的部分代碼如下:

        Public class FlightOrder: ATicketSubject {

        private string orderState; //得到當(dāng)前用戶(hù)是否支付訂單}

        4) 具體觀察者

        在本問(wèn)題中,購(gòu)票之后的操作為具體觀察者;創(chuàng)建的具體觀察者類(lèi)分別為:SMSOperator和DBRecorder。SMSOperator部分代碼如下:

        Public class SMSOperator implements ITicketObserver {

        private string observerState;

        private ATicketSubject subject;

        public SMSOperator (ATicketSubject subject) {

        this.subject = subject;}

        Public void update(){

        observerState = subject.SubjectState;

        if(observerState =”訂單已支付”){

        sendMessage(); //發(fā)送短信給用戶(hù)}

        }

        具體觀察者DBRecorder的代碼同具體觀察者SMSOperator。

        從上述代碼中可以看出,觀察者模式體現(xiàn)了松耦合的設(shè)計(jì)原則:即當(dāng)Subject類(lèi)中的數(shù)據(jù)有更改時(shí),會(huì)調(diào)用notifyObserver函數(shù),來(lái)通知所有的觀察者更新數(shù)據(jù),即調(diào)用Observer中的Update方法,但是Update只是在觀察者中更新了數(shù)據(jù),但是這些數(shù)據(jù)具體如何應(yīng)用就看觀察者自己的了。在訂單完成支付時(shí),購(gòu)票系統(tǒng)會(huì)通知數(shù)據(jù)觀察者更新記錄數(shù)據(jù),短信觀察者給用戶(hù)發(fā)短信。但這一切的動(dòng)作都與主題和Update無(wú)關(guān)了。從而在遵循觀察者模式最小的接口的規(guī)則下,觀察者怎么改變(即再實(shí)現(xiàn)其他動(dòng)作接口,繼承其他超類(lèi)),都不會(huì)影響主題類(lèi)。而主題類(lèi)的具體實(shí)現(xiàn)者(ConcreteSubject)中無(wú)論擴(kuò)展什么樣的行為,也不會(huì)影響觀察者(Observer)。

        4.3觀察者模式優(yōu)缺點(diǎn)

        觀察者模式在被觀察者和觀察者之間建立起松耦合關(guān)系這種“針對(duì)抽象編程”的做法體現(xiàn)了面向?qū)ο笤O(shè)計(jì)復(fù)用原則中的“依賴(lài)倒轉(zhuǎn)原則”,可以有效減少模塊間的“緊耦合”,有利于提高系統(tǒng)的可維護(hù)性和擴(kuò)展性[8]。

        但是從上述代碼中可以看出,依賴(lài)關(guān)系并未完全解除,抽象通知者依舊依賴(lài)抽象的觀察者。在多個(gè)具體觀察者中,并不是所有的觀察者都執(zhí)行相同的Update方法[9],也就是說(shuō)SMSOperator類(lèi)中的sendMessage()方法和DBRecorder中的updateData()方法關(guān)注的目標(biāo)中的狀態(tài)是相同的,但具體觀察者所執(zhí)行的操作卻是截然不同的[10],把它們統(tǒng)一抽象為Update(),這和現(xiàn)實(shí)世界中的命名是矛盾的。

        4.4基于為事件委托的觀察者模式

        要想消除上述依賴(lài)關(guān)系,“.NET”框架中的委托機(jī)制恰恰具備這個(gè)特征:委托并不知道也不關(guān)心它引用的方法所屬的類(lèi),只要方法的簽名與委托的簽名相匹配,該方法就可以被調(diào)用[11]。“.NET”框架還提供了事件(event)機(jī)制。事件是建立在委托機(jī)制上的,包含了事件成員的對(duì)象在某些特定事情發(fā)生時(shí)可通知其他對(duì)象[12]。

        通過(guò)在目標(biāo)對(duì)象中定義一組事件和委托,將具題觀察者中的Update()方法作為委托對(duì)象與目標(biāo)對(duì)象的事件綁定來(lái)實(shí)現(xiàn)通知更新的服務(wù)。一方面,目標(biāo)發(fā)送通知時(shí),利用委托允許同時(shí)被委托者增加多個(gè)對(duì)象這一“多播”的特性,來(lái)實(shí)現(xiàn)注冊(cè)觀察者[13],在執(zhí)行Notify()方法時(shí),無(wú)需指定觀察者,通知會(huì)自動(dòng)傳播。另一方面,觀察者自己決定是否需要接受通知[14]。利用ASP.NET中頁(yè)面回傳的事件處理機(jī)制,來(lái)達(dá)到觀察者注銷(xiāo)的效果[15],基于事件機(jī)制的觀察者模式如圖3所示。

        圖3 基于事件的觀察者模式

        圖3中可以看出,通過(guò)在具體目標(biāo)類(lèi)中聲明事件,在客戶(hù)端程序中關(guān)聯(lián)和引發(fā)事件,降低了了Observer和Subject的耦合度,具體觀察者只依賴(lài)于Subject。要引入新的通知操作,只需要在具體觀察者的更新方法與具體主題中的相關(guān)事件關(guān)聯(lián)即可。相關(guān)代碼如下

        1) 具體目標(biāo)類(lèi)FlightOrder代碼如下:

        public class FlightOrder: Subject

        {

        private string orderState;

        public delegate void EventHandler () ; / / 聲明委托類(lèi)型及簽名

        public event EventHandler Update; / / 聲明事件 Update

        public void Notify()

        {

        Update() ;}}

        2) DBRecorder(具體觀察者ConcreteObserver1)

        public class DBRecorder

        {

        public void updateData (){}

        }

        3) SMSOperator(具體觀察者ConcreteObserver2)

        public class SMSOperator

        {

        public void sendMessage(){}

        }

        4) 客戶(hù)端

        FlightOrder fo= new FlightOrder () ; / /定義具有目標(biāo)對(duì)象

        / / 定義 2 個(gè)具體的觀察者

        DBRecoder db= new DBRecoder(“我是數(shù)據(jù)庫(kù)觀察者”,fo)

        SMSOperator sms= new SMSOperator( “我是信息觀察者”,fo)

        / / 將方法updateData 和sendMessage和事件 Update關(guān)聯(lián)

        fo.Update + = new EventHandler (db.updateData) ;

        fo.Update + = new EventHandler (sms.sendMessage) ;

        fo. orderState =“訂單已經(jīng)支付”;

        fo.Notify ();/ Update 事件,分別調(diào)用方法 updateData 和 sendMessage

        5 結(jié)語(yǔ)

        觀察者模式是解決軟件設(shè)計(jì)中對(duì)象間一對(duì)多依賴(lài)關(guān)系的高效和成熟的設(shè)計(jì)模板,在軟件系統(tǒng)開(kāi)發(fā)中被廣泛應(yīng)用。國(guó)外在研究設(shè)計(jì)模式的同時(shí),也在相對(duì)應(yīng)的研究反模式。反模式其實(shí)也是一種模式,不過(guò)它主要考察的是這種模式所帶來(lái)的不良后果。用面向抽象設(shè)計(jì)原則指導(dǎo)分析與解決問(wèn)題,通過(guò)發(fā)現(xiàn)可能變化的結(jié)構(gòu),用面向抽象的方法對(duì)其進(jìn)行封裝與隱藏,所取得的效果可能與采用設(shè)計(jì)模式一致甚至更優(yōu)[16]。

        [1] ROBERT C MARTIN. Design Principles and Design Patterns[EB/OL]. http://www.objectmentor.com,2008-08-03.

        [2] 李航.基于MDA的BSS計(jì)費(fèi)系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[D].哈爾濱:哈爾濱工業(yè)大學(xué),2012:24.

        LI Hang. MDA-based BSS billing system design and implementation[D]. Harbin: Harbin Institute of Technology,2012:24.

        [3] 耿祥義,張躍平.Java設(shè)計(jì)模式[M].北京:清華大學(xué)出版社,2009:132-134.

        GENG Xiangyi, ZHANG Yueping. Java design pattern[M]. Beijing: Tsinghua University Press,2009:132-134.

        [4] 曹步清,金甌.Java中的Abstract Class與Interface技術(shù)研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,2006,8:109.

        CAO Buqing, JIN Ou. In Java Abstract Class and Interface technology research[J]. Computer Technology and Development,2006,8:109.

        [5] 孟婷婷,何利力.Observer設(shè)計(jì)模式在手機(jī)導(dǎo)航軟件中的應(yīng)用[J].電腦知識(shí)與技術(shù),2014,7:5.

        MENG Tingting, HE Lili. The Observer design pattern in the application of mobile navigation software[J]. Computer Knowledge and Technology,2014,7:5.

        [6] Erich Gamma, Richard Helm, Ralph Johnson.設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)[M].李英軍,馬曉星,蔡敏等,譯.北京:機(jī)械工業(yè)出版社,2005:89.

        Erich Gamma, Richard Helm, Ralph Johnson. Design patterns: elements of reusable object-oriented software[M]. LI Yingjun, MA Xiaoxing, CAI Min, et al. Beijing: The Basis of Mechanical Industry Publishing House,2005:89.

        [7] kongls08.設(shè)計(jì)模式六大原則(3):依賴(lài)倒置原則[EB/OL]. http://blog.csdn.net/kongls08/article/details/6365833.

        kongls08. Design pattern six principles (3): dependency inversion principle[EB/OL]. http://blog.csdn.net/kongls08/article/details/6365833.

        [8] 歐陽(yáng)宏基,楊衛(wèi)忠,趙薔.觀察者模式在Java事件處理中的應(yīng)用研究[J].微處理機(jī),2013.4:77.

        OUYANG HongJi, YANG Weizhong, ZHAO Qiang. The observer pattern in Java event processing application[J]. Journal of Microprocessor,2013,4:77.

        [9] 張寧,王越,王東.觀察者模式及其在軟件開(kāi)發(fā)中的應(yīng)用[J].大眾科技,2008,11:10.

        ZHANG Ning, WANG Yue, WANG Dong. The observer pattern and its application in software development[J]. Journal of Popular Science and Technology,2008,11:10.

        [10] 吳清壽.基于事件機(jī)制的觀察者模式及應(yīng)用[J].重慶理工大學(xué)學(xué)報(bào),2012,26(9):102-103.

        WU Qingshou. The observer pattern based on event mechanism and application[J]. Journal of Chongqing University of Science and Technology,2012,26(9):102-103.

        [11] Entrusted tutor[EB/OL]. http://msdn.miscrosoft.com/library /chs/defaul.asp?url =/library /CHS/csref/html/vew lkdelegatestutorial.asp.

        [12] 微軟公司.基于C#的.NET Framework程序設(shè)計(jì)[M].北京:高等教育出版社,2004:149.

        Microsoft. Based on the C#. NET Framework programming[M]. Beijing: Higher Education Press,2004:149.

        [13] 吳清壽.基于事件機(jī)制的觀察者模式及應(yīng)用[J].重慶理工大學(xué)學(xué)報(bào),2012,26(9):101-102.

        WU Qingshou. The observer pattern based on event mechanism and application[J]. Journal of Chongqing University of Science and Technology,2012,26(9):101-102.

        [14] 馮新?lián)P,沈建京,姚松林.基于ASP.NET的觀察者模式應(yīng)用研究[J].計(jì)算機(jī)應(yīng)用與軟件,2008:173-1741.

        FENG Xinyang, SHEN Jianjing, YAO Songlin. Based on the observer pattern of ASP.NET application study[J]. Journal of Computer Applications and Software,2008:173-1741.

        [15] 周永麒.數(shù)字校園的中學(xué)信息化平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)[D].上海:交通大學(xué),2012,7:12.

        ZHOU Yonglin. The design and implementation of high school information platform of digital campus[D]. Shanghai Jiaotong University,2012,7:12.

        [16] 延開(kāi),定海.面向?qū)ο蠓治龊驮O(shè)計(jì)[M].北京:清華大學(xué)出版社,2001:105.

        YAN Kai, DING Hai. Object-oriented analysis and design[J]. Beijing: Tsinghua University Press,2001:105.

        Application of the Observer Mode in Abstract-Oriented Programming

        LIU Lingyun

        (College of Computer and Information Technology, Northeast Petroleum University, Daqing163000)

        In order to improve scalability and maintainability os software system, a system framework must be able to build to adapt to the changing needs of the user is system design, therefore, in dealing with one to many dependencies in the system, abstract oriented way of thinking is used, the observer mode is introduced, the change part is separated from unchange part, an abstract class or interface is formed, so that when an user needs change, an abstract class or interface implementation class is added without changing the original code, thereby the robustness of the system is improved greatly the cost of software maintenance is reduced. Practice has proved that in project design, which layer is abstracted specifically can combine various development platforms and make adjustments and optimization, it is not immutable.

        abstract-oriented programming, observer mode, abstract, interface, event, delegate

        2016年2月7日,

        2016年3月30日

        劉凌云,女,碩士,研究方向:軟件工程。

        TP311

        10.3969/j.issn.1672-9722.2016.08.017

        猜你喜歡
        方法設(shè)計(jì)
        何為設(shè)計(jì)的守護(hù)之道?
        《豐收的喜悅展示設(shè)計(jì)》
        流行色(2020年1期)2020-04-28 11:16:38
        學(xué)習(xí)方法
        瞞天過(guò)?!律O(shè)計(jì)萌到家
        設(shè)計(jì)秀
        海峽姐妹(2017年7期)2017-07-31 19:08:17
        有種設(shè)計(jì)叫而專(zhuān)
        Coco薇(2017年5期)2017-06-05 08:53:16
        可能是方法不對(duì)
        用對(duì)方法才能瘦
        Coco薇(2016年2期)2016-03-22 02:42:52
        四大方法 教你不再“坐以待病”!
        Coco薇(2015年1期)2015-08-13 02:47:34
        賺錢(qián)方法
        成人精品天堂一区二区三区| 每日更新在线观看av| 亚洲中国精品精华液| 午夜精品射精入后重之免费观看| 亚洲av日韩av无码污污网站| 天天看片视频免费观看| 国产精品开放小视频| 久久久久久国产精品美女| 四虎影视久久久免费| 最新国产精品精品视频| 国产优质av一区二区三区| 亚洲国产一区二区三区| 免费无码一区二区三区a片百度| 色 综合 欧美 亚洲 国产| 婷婷丁香91| 激情综合五月天开心久久| 五月婷婷丁香视频在线观看| 亚洲精品视频在线一区二区| 国产七十六+老熟妇| 国产亚洲美女精品久久久| 日本a在线免费观看| 人妻风韵犹存av中文字幕| 美腿丝袜日韩在线观看| 人人妻人人澡人人爽人人精品av| 中日韩精品视频在线观看| 国产亚洲精品自在久久蜜tv| 国产AV无码无遮挡毛片| 日韩女优一区二区在线观看| 国产丝袜美腿精品91在线看| 中文无码精品a∨在线观看不卡| 九九视频在线观看视频6| 成人午夜无人区一区二区| 精品一区二区三区女同免费 | 国产精品视频一区二区三区不卡| 亚洲欧美日韩国产综合一区二区| 欧洲亚洲视频免费| 国产精品污一区二区三区在线观看| 亚洲av熟女少妇久久| 国产亚洲欧美精品久久久| 亚洲人成无码网站久久99热国产 | 最新福利姬在线视频国产观看 |