java設計模式之 裝飾器模式

來源:互聯網
上載者:User

標籤:ant   結構型模式   style   構造   logs   java設計   --   建立   code   

裝飾器模式

裝飾器模式(Decorator Pattern)允許向一個現有的對象添加新的功能,同時又不改變其結構。

這種類型的設計模式屬於結構型模式,它是作為現有的類的一個封裝。

這種模式建立了一個裝飾類,用來封裝原有的類,並在保持類方法簽名完整性的前提下,動態給一個對象添提供了額外的功能。

 

我們通過下面的執行個體來示範裝飾器模式的用法。類比一個人從想吃飯、找飯店、享受美食、結束吃飯的過程

 

代碼展示:

首先建立一個被修飾的介面 Eat

package decorator;//吃飯介面public interface Eat {    //吃飯方法    void eat();}

建立一個被修飾者並且有自己的狀態

package decorator;public class Person implements Eat {    @Override    public void eat() {        System.out.println("======我餓了======");    }}

建立一個修飾者的抽象類別

package decorator;public abstract class LikeEat implements Eat {    private Eat eat;        public LikeEat(Eat eat) {        this.eat=eat;    }        @Override    public void eat() {        eat.eat();    }}

建立五個修飾類的擴充類(即--擴充修飾),分別擁有自己特定的狀態,豐富被修飾的類

public class FindInMap extends LikeEat {    public FindInMap(Eat eat) {        super(eat);    }    public void userMap(){        System.out.println("開啟地圖尋找美食");    }        @Override    public void eat() {        super.eat();        userMap();    }}public class GotoRestaurant extends LikeEat {    public GotoRestaurant(Eat eat) {        super(eat);    }    public void onWay(){        System.out.println("去往飯店的路上");    }        @Override    public void eat() {        super.eat();        onWay();    }    }public class InRestaurant extends LikeEat {    public InRestaurant(Eat eat) {        super(eat);    }        public void selectFoot(){        System.out.println("到達飯店選擇食物");    }        @Override    public void eat() {        super.eat();        selectFoot();    }}public class EatFoot extends LikeEat {    public EatFoot(Eat eat) {        super(eat);    }        public void eating(){        System.out.println("享用美食中");    }    @Override    public void eat() {        super.eat();        eating();    }}public class endEat extends LikeEat {    public endEat(Eat eat) {        super(eat);    }        public void afterEat(){        System.out.println("=====美食結束=====");    }        @Override    public void eat() {        super.eat();        afterEat();    }}

建立測試類別,測試修飾效果

public class EatTest {    public static void main(String[] args) {        Eat person = new Person();        likeEat likeEat = new endEat(                           new EatFoot(                           new InRestaurant(                           new GotoRestaurant(                           new FindInMap(person))))) ;        likeEat.eat();    }}

運行結果:

總結:
A、LikeEat抽象類別中,持有Eat介面,方法全部委託給該介面調用,目的是交給該介面的實作類別即子類進行調用。
B、LikeEat抽象類別的子類(具體裝飾者),裡面都有一個構造方法調用super(eat),這一句就體現了抽象類別依賴於子類實現即抽象依賴於實現的原則。因為構造裡面參數都是Eat介面,只要是該Eat的實作類別都可以傳遞進去,即表現出

          likeEat likeEat = new endEat(
                    new EatFoot(
                      new InRestaurant(
                        new GotoRestaurant(
                          new FindInMap(person)))))

這種結構的樣子。所以當調用likeEat.eat()的時候,又因為每個具體裝飾者類中,都先調用super.eat();方法,而該super已經由構造傳遞並指向了具體的某一個裝飾者類(這個可以根據需要調換順序),那麼調用的即為裝飾類的方法,然後才調用自身的裝飾方法,即表現出一種裝飾、鏈式的類似於過濾的行為。

C、具體被裝飾者,可以定義初始的狀態或者初始的自己的裝飾,後面的裝飾行為都在此基礎上一步一步進行點綴、裝飾。
D、裝飾者模式的設計原則為:

  對擴充開放、對修改關閉,這句話體現在我如果想擴充被裝飾者類的行為,無須修改裝飾者抽象類別,只需繼承裝飾者抽象類別,實現額外的一些裝飾或者叫行為即可對被裝飾者進行封裝。

 

java設計模式之 裝飾器模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.