設(shè)計(jì)模式總結(jié)

學(xué)一樣?xùn)|西,自己另外舉個(gè)例子實(shí)現(xiàn)一遍,才能知道里面的原理.記錄一下學(xué)習(xí)的幾種基本的設(shè)計(jì)模式

文件結(jié)構(gòu)

幾種設(shè)計(jì)模式的文件結(jié)構(gòu)如下圖所示

目錄結(jié)構(gòu)圖

源代碼下載
源碼下載

代理模式

說(shuō)明

這里我舉了一個(gè)網(wǎng)頁(yè)渲染時(shí)使用代理延遲加載圖片的例子,用線程的睡眠模擬延遲加載,hibernate的延遲加載就是用了代理模式實(shí)現(xiàn)
代理模式的主要應(yīng)用:

  1. 遠(yuǎn)程代理,例如webservice
  2. 虛擬代理,html渲染
  3. 安全代理,控制真實(shí)對(duì)象的訪問(wèn)權(quán)限

spring的AOP就是用的代理模式的思想設(shè)計(jì)實(shí)現(xiàn)的

類(lèi)圖

UML類(lèi)圖

代碼

package codeDesign.proxy;
/**
 * Created by kangbiao on 2015/11/22.
 * 網(wǎng)頁(yè)繪制接口,代理和被代理類(lèi)均實(shí)現(xiàn)該接口
 */
public interface Draw {
    /**
     * 繪制圖片啸澡,需要花很多時(shí)間碟狞,使用代理來(lái)繪制
     * @param url
     */
    void drawPicture(String url);
}

package codeDesign.proxy;
/**
 * Created by kangbiao on 2015/11/22.
 * 繪制html網(wǎng)頁(yè)的類(lèi)(該類(lèi)會(huì)消耗很多時(shí)間)
 */
public class HtmlDraw implements Draw{
    /**
     * 該方法不耗時(shí),不需要代理
     * @param text
     */
    public void drawText(String text) {
        System.out.println("正在繪制文字:" + text);
    }
    /**
     * 會(huì)消耗一定的時(shí)間携茂,需要代理
     * @param url
     */
    @Override
    public void drawPicture(String url) {
        System.out.println("圖片區(qū)域正在從遠(yuǎn)程加載圖片");
        try {
            Thread.sleep(5000);
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("正在繪制圖片:"+url);
    }
}

package codeDesign.proxy;
/**
 * Created by kangbiao on 2015/11/22.
 * 圖片繪制代理類(lèi)
 */
public class ProxyDraw implements Draw {
    HtmlDraw htmlDraw;
    public ProxyDraw(){
        this.htmlDraw=new HtmlDraw();
    }
    @Override
    public void drawPicture(String url) {
        System.out.println("代理先輸出一張占位圖片");
        new Thread(new Runnable() {
            @Override
            public void run() {
                htmlDraw.drawPicture("1.jpg");
                System.out.println("代理去掉占位圖片");
            }
        }).start();
    }
}

package codeDesign.proxy;
/**
 * Created by kangbiao on 2015/11/22.
 * 代理模式測(cè)試類(lèi)
 */
public class ProxyTest {
    /**
     * 該過(guò)程演示了網(wǎng)頁(yè)的繪制過(guò)程拳锚,使用代理模式異步繪制網(wǎng)頁(yè)上面的圖片
     * @param args
     */
    public static void main(String[] args){
        HtmlDraw htmlDraw=new HtmlDraw();
        htmlDraw.drawText("文字1");
        ProxyDraw proxyDraw=new ProxyDraw();
        proxyDraw.drawPicture("1.jpg");
        htmlDraw.drawText("文字2");
    }
}

工廠模式

說(shuō)明

最基礎(chǔ)的設(shè)計(jì)模式

類(lèi)圖

工廠模式UML類(lèi)圖

代碼

package codeDesign.factory;
/**
 * Created by kangbiao on 2015/11/21.
 *
 */
public class Tea {
    private String sugar;
    public void mixSugarTea(){
        System.out.print("只有"+sugar);
    }
    public String getSugar()
    {
        return sugar;
    }
    public void setSugar(String sugar)
    {
        this.sugar = sugar;
    }
}

package codeDesign.factory;
/**
 * Created by kangbiao on 2015/11/21.
 * 藍(lán)茶
 */
public class BlueTea extends Tea{
    public void mixSugarTea(){
        System.out.print(super.getSugar()+"藍(lán)茶");
    }
}

package codeDesign.factory;
/**
 * Created by kangbiao on 2015/11/21.
 * 紅茶
 */
public class BlackTea extends Tea{
    public void mixSugarTea(){
        System.out.print(super.getSugar()+"紅茶");
    }
}

package codeDesign.factory;
/**
 * Created by kangbiao on 2015/11/21.
 * 茶的工廠類(lèi)
 */
public class TeaFactory {
    public static Tea getTea(String teaType){
        Tea tea;
        switch (teaType){
            case "black":
                tea=new BlackTea();
                break;
            case "blue":
                tea=new BlueTea();
                break;
            default:
                tea=new Tea();
                break;
        }
        return tea;
    }
}

package codeDesign.factory;
/**
 * Created by kangbiao on 2015/11/21.
 * 工廠模式測(cè)試
 */
public class FactoryTest {
    public static void main(String[] args){
        Tea tea = TeaFactory.getTea("black");
        tea.setSugar("紅糖");
        tea.mixSugarTea();
    }
}

裝飾器模式

說(shuō)明

  1. 如果只有一個(gè)Concrete Component類(lèi)而沒(méi)有抽象的Component接口時(shí)叹洲,可以讓Decorator繼承Concrete Component糜芳。
  2. 如果只有一個(gè)Concrete Decorator類(lèi)時(shí),可以將Decorator和Concrete Decorator合并妖枚。
  3. java的io流包就是使用的裝飾器模式

類(lèi)圖

裝飾器模式UML類(lèi)圖

代碼

package codeDesign.decorator;
/**
 * Created by kangbiao on 2015/11/21.
 * 汽車(chē)類(lèi)
 */
public class Car {
    public void showFunc(){
        System.out.print("組裝完畢");
    }
}

package codeDesign.decorator;
/**
 * Created by kangbiao on 2015/11/21.
 * 汽車(chē)的功能類(lèi)
 */
public class Function extends Car{
    protected Car car;
    public void addFuncs(Car car){
        this.car=car;
    }
    public void showFunc(){
        if (car!=null){
            car.showFunc();
        }
    }
}

package codeDesign.decorator;
/**
 * Created by kangbiao on 2015/11/21.
 * 制動(dòng)功能
 */
public class BrakingFunction extends Function{
    public void showFunc(){
        System.out.print("制動(dòng)");
        super.showFunc();
    }
}

package codeDesign.decorator;
/**
 * Created by kangbiao on 2015/11/21.
 * ABS防抱死功能
 */
public class ABSFunction extends Function{
    public void showFunc(){
        System.out.print("ABS");
        super.showFunc();
    }
}

package codeDesign.decorator;
/**
 * Created by kangbiao on 2015/11/21.
 * 裝飾模式測(cè)試
 */
public class DecoratorTest {
    public static void main(String[] args){
        Car car=new Car();
        ABSFunction abs=new ABSFunction();
        BrakingFunction braking=new BrakingFunction();
        abs.addFuncs(car);
        braking.addFuncs(abs);
        braking.showFunc();
    }
}

策略模式

說(shuō)明

這里我結(jié)合了工廠模式,使得加密算法的選擇邏輯不用暴露給客戶端
Strategy中定義了公共算法的實(shí)現(xiàn)接口,然后通過(guò)多態(tài)在Context動(dòng)態(tài)的創(chuàng)建不同的實(shí)現(xiàn)類(lèi)的實(shí)例從而達(dá)到算法策略選擇邏輯
簡(jiǎn)化單元測(cè)試,因?yàn)槊恳粋€(gè)具體的實(shí)現(xiàn)都在一個(gè)類(lèi)里面,可以分開(kāi)測(cè)試
減少了算法調(diào)用類(lèi)和算法實(shí)現(xiàn)類(lèi)之間的耦合

類(lèi)圖

策略模式UML類(lèi)圖

代碼

package codeDesign.strategy;
/**
 * Created by kangbiao on 2015/11/21.
 * 加密算法接口
 */
public interface EncryptStrategy {
    /**
     * 加密算法實(shí)現(xiàn)接口
     * @param rawString
     * @return
     */
    String doEncrypt(String rawString);
}

package codeDesign.strategy;
/**
 * Created by kangbiao on 2015/11/21.
 * md5加密策略實(shí)現(xiàn)類(lèi)
 */
public class MD5Strategy implements EncryptStrategy{
    @Override
    public String doEncrypt(String rawString) {
        return "MD5("+rawString+")";
    }
}

package codeDesign.strategy;
/**
 * Created by kangbiao on 2015/11/21.
 * SHA1加密實(shí)現(xiàn)類(lèi)
 */
public class SHA1Strategy implements EncryptStrategy {
    @Override
    public String doEncrypt(String rawString) {
        return "SHA1("+rawString+")";
    }
}

package codeDesign.strategy;
/**
 * Created by kangbiao on 2015/11/21.
 * 加密上下文維護(hù)類(lèi)廷臼,客戶端調(diào)用類(lèi)
 */
public class EncryptContext {
    private EncryptStrategy encryptStrategy;
    public final static byte MD5=0;
    public final static byte SHA1=1;
    /**
     * 這里實(shí)現(xiàn)用工廠模式實(shí)現(xiàn)自動(dòng)裝載不同的類(lèi)
     * @param method
     */
    public EncryptContext(Byte method){
        switch (method){
            case MD5:
                this.encryptStrategy=new MD5Strategy();
                break;
            case SHA1:
                this.encryptStrategy=new SHA1Strategy();
                break;
            default:
                break;
        }
    }
    public String doEncrypt(String rawString){
        return encryptStrategy.doEncrypt(rawString);
    }
}

package codeDesign.strategy;
/**
 * Created by kangbiao on 2015/11/21.
 * 策略模式測(cè)試類(lèi)
 */
public class EncryptTest {
    public static void main(String[] args){
        EncryptContext encryptContext=new EncryptContext(EncryptContext.MD5);
        String result=encryptContext.doEncrypt("123456");
        System.out.print(result);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市绝页,隨后出現(xiàn)的幾起案子荠商,更是在濱河造成了極大的恐慌,老刑警劉巖续誉,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莱没,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡屈芜,警方通過(guò)查閱死者的電腦和手機(jī)郊愧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)井佑,“玉大人属铁,你說(shuō)我怎么就攤上這事」蹋” “怎么了焦蘑?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)盒发。 經(jīng)常有香客問(wèn)我例嘱,道長(zhǎng),這世上最難降的妖魔是什么宁舰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任拼卵,我火速辦了婚禮,結(jié)果婚禮上蛮艰,老公的妹妹穿的比我還像新娘腋腮。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布即寡。 她就那樣靜靜地躺著徊哑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪聪富。 梳的紋絲不亂的頭發(fā)上莺丑,一...
    開(kāi)封第一講書(shū)人閱讀 52,821評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音墩蔓,去河邊找鬼梢莽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛钢拧,可吹牛的內(nèi)容都是我干的蟹漓。 我是一名探鬼主播,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼源内,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了份殿?” 一聲冷哼從身側(cè)響起膜钓,我...
    開(kāi)封第一講書(shū)人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卿嘲,沒(méi)想到半個(gè)月后颂斜,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拾枣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年沃疮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梅肤。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡司蔬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出姨蝴,到底是詐尸還是另有隱情俊啼,我是刑警寧澤,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布左医,位于F島的核電站授帕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏浮梢。R本人自食惡果不足惜跛十,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秕硝。 院中可真熱鬧芥映,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)朋腋。三九已至诫舅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間痊末,已是汗流浹背唁盏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工内狸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人厘擂。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓昆淡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親刽严。 傳聞我的和親對(duì)象是個(gè)殘疾皇子昂灵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

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