真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

設(shè)計模式---裝飾器模式

簡述

運行時,為原對象拓展新的行為。

成都創(chuàng)新互聯(lián)公司成立于2013年,先為千陽等服務(wù)建站,千陽等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為千陽企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

相較于傳統(tǒng)的繼承來拓展新的行為,裝飾器模式更為的靈活多變,當(dāng)然實現(xiàn)起來也更為復(fù)雜。

話不多說,看個優(yōu)化案例吧。

優(yōu)化案例

最初版v0

現(xiàn)有系統(tǒng)中有設(shè)定窗口Style的模塊,現(xiàn)在想增加一個圓角的樣式。以下是現(xiàn)有模塊的代碼。

class Style {
    public void style() {
        System.out.println("設(shè)置Order");
    }
}

第一種傳統(tǒng)的修改方式。

class Style {
    public void style() {
        System.out.println("設(shè)置Order");
        System.out.println("設(shè)置Radius");
    }
}

雖然代碼簡單,但細(xì)想一下,如果我們?nèi)蘸笕匀恍枰獑为氃O(shè)置Order的樣式怎么辦。現(xiàn)在的代碼實現(xiàn)已經(jīng)無法滿足了不是?

為此,我們可能會想到另一種方案。使用繼承。

class BaseStyle {
    public void style() {
        System.out.println("設(shè)置Order");
    }
}
class Radius extends BaseStyle {
    public void style() {
        super.style();
        System.out.println("設(shè)置Radius");
    }
}

確實,如果不在意類的命名的話,目前來看這確實是個好的選擇。請注意,只是目前來看。設(shè)計不只著眼與當(dāng)前,而是需要放眼未來。什么意思呢?比如,當(dāng)未來需要添加一個Color樣式的時候怎么辦,有人可能認(rèn)為添加再添加一個BassStyle類的子類Color就好了;如果客戶就只要一個單獨的Color樣式呢,或者說需要一個可以設(shè)置Radius和Color的樣式。再超前一些,客戶如果想要的是增加一個樣式,且可以與現(xiàn)有的任何一種或多種樣式隨意組合呢?又該怎么辦?傳統(tǒng)的繼承已經(jīng)搞不了了呀。

別慌,最后這一種需求正好就是使用裝飾器模式的目的。我們來看看改進后的案例吧。

修改版v1

使用裝飾器模式優(yōu)化上述需求,使得任意樣式間可以任意組合,這種任意組合包括任意種類和數(shù)量。

public interface Style {
    void style();
}
public class Order implements Style {
    @Override
    public void style() {
        System.out.println("設(shè)置Order");
    }
}
public class Radius implements Style {
    @Override
    public void style() {
        System.out.println("設(shè)置Radius");
    }
}

public class Color implements Style {
    @Override
    public void style() {
        System.out.println("設(shè)置Color");
    }
}
public class OrderDecorator implements Style {
    private Style style;
    public OrderDecorator(Style target) {
        this.style = target;
    }
    @Override
    public void style() {
        style.style();
        decorator();
    }
    private void decorator() {
        System.out.println("設(shè)置Order");
    }
}
public class RadiusDecorator implements Style {
    private Style style;
    public RadiusDecorator(Style target) {
        this.style = target;
    }
    @Override
    public void style() {
        style.style();
        decorator();
    }
    private void decorator() {
        System.out.println("設(shè)置Radius");
    }
}
public class ColorDecorator implements Style {
    private Style style;
    public ColorDecorator(Style target) {
        this.style = target;
    }
    @Override
    public void style() {
        style.style();
        decorator();
    }
    private void decorator() {
        System.out.println("設(shè)置Color");
    }
}

定義三個裝飾器類:OrderDecorator, RadiusDecorator, ColorDecorator分別實現(xiàn)Style接口,定義decorator方法用(動態(tài)拓展的核心方法之一)。調(diào)用完``targetstyle方法后調(diào)用decorator`方法實現(xiàn)功能的動態(tài)拓展。接著,看看客戶端如何使用。

public class Client {
    public static void main(String[] args) {
        Style style = new Order();
        Style style1 = new ColorDecorator(style);
        Style style2 = new RadiusDecorator(style1);
        style2.style();
    }
}

輸出結(jié)果:

設(shè)置Order
設(shè)置Color
設(shè)置Radius

修改版v2

上述優(yōu)化可以看到一些重復(fù)冗余的代碼,還有再次優(yōu)化的空間。以下是實現(xiàn)樣例。

public interface Style {
    void style();
}
public class Order implements Style {
    @Override
    public void style() {
        System.out.println("設(shè)置Order");
    }
}
public class Radius implements Style {
    @Override
    public void style() {
        System.out.println("設(shè)置Radius");
    }
}
public class Color implements Style {
    @Override
    public void style() {
        System.out.println("設(shè)置Color");
    }
}
public abstract class StyleDecorator implements Style { // 抽出共通新建裝飾類的高層抽象類
    protected Style style;
    public StyleDecorator(Style target) {
        this.style = target;
    }
    @Override
    public void style() { // style設(shè)置
        style.style();
        decorator();
    }
    protected abstract void decorator(); // 裝飾方法
}
public class OrderDecorator extends StyleDecorator {
    public OrderDecorator(Style target) {
        super(target);
    }
    @Override
    protected void decorator() {
        System.out.println("設(shè)置Order");
    }
}
public class RadiusDecorator extends StyleDecorator {
    public RadiusDecorator(Style target) {
        super(target);
    }
    @Override
    protected void decorator() {
        System.out.println("設(shè)置Radius");
    }
}
public class ColorDecorator extends StyleDecorator {
    public ColorDecorator(Style target) {
        super(target);
    }
    @Override
    protected void decorator() {
        System.out.println("設(shè)置Color");
    }
}

客戶端的使用和輸出結(jié)果還是和v1一樣。

public class Client {
    public static void main(String[] args) {
        Style style = new Order();
        Style style1 = new ColorDecorator(style);
        Style style2 = new RadiusDecorator(style1);
        style2.style();
    }
}

輸出結(jié)果:

設(shè)置Order
設(shè)置Color
設(shè)置Radius

新建高層抽象類,講冗余的方法屬性都打包到抽象類中,減少重復(fù)的代碼。
這個應(yīng)該屬于題外話了,可以見得設(shè)計模式的實現(xiàn)方式是多種多樣的。不要過度拘泥于模板。只要能達成目的,想怎么設(shè)計就可以怎么設(shè)計。

修改版v1和v2都是裝飾器模式,實際開發(fā)根據(jù)需求斟酌即可。

總結(jié)

優(yōu)點

  1. 開發(fā)時可以自由組合各種各樣的功能。
  2. 新增的功能對于現(xiàn)有功能沒有任何的影響。

缺點

  1. 增加系統(tǒng)的復(fù)雜度。
  2. 對于開發(fā)人員的技術(shù)要求提高。

應(yīng)用場景

  1. 需要靈活組合功能的場合。
  2. 限制繼承,但又想拓展類的功能的場合。

文章名稱:設(shè)計模式---裝飾器模式
標(biāo)題鏈接:http://weahome.cn/article/dsoiohd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部