程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Java設計模式(二) Decorator(裝飾)模式及Java I/O引申

Java設計模式(二) Decorator(裝飾)模式及Java I/O引申

編輯:JAVA綜合教程

Java設計模式(二) Decorator(裝飾)模式及Java I/O引申


基本概念

Decorator

職能上:
動態地給一個對象添加一些額外的職責,就增加功能來說 Decorator比從基類生成子類更靈活,而且能有效地控制子類的數量,防止子類爆炸(後面的特性會印證這個優勢)。 結構(工作原理)上:
可以創建始於Decorator對象(負責新功能的對象)終於原對象的一個對象鏈 實現上:
Decorator模式將Decrator對象(能夠提供額外的功能)與這些對象的使用規則分離開來,因為每個對象只關注自己的功能,而不關注自己按照如何添加到對象鏈中 這使我們有機會任意重排Decorator對象並串聯,而無須改變其的任何代碼。 因為功能的分離,Decorator對象有更好的內聚性 通過繼承基類實現子類的方式因為對於每個排列都要重新實現,所以難以避免子類爆炸的問題。 Decorator模式能夠將子類數量控制在Decorator級別,理論上與繼承方法相比是N!的差別。 因為避免了繼承,所以自然而然獲得了更好的封裝性 組成上:
Component(組件):組件的抽象,包括裝飾者被裝飾者  Concrete Component(原始組件):被裝飾的對象,也就是被裝飾者 Decorator(裝飾者):具體的裝飾組件的抽象,包含一個抽象component的構件(具體可能是原始組件,也可能是裝飾者),繼承自Component Concrete Decorator:具體的裝飾組件,用於實現具體的附加功能。

例講Decorator(裝飾者)模式

現在還處於實習生招生季,簡歷是一切的基石,畢竟簡歷不過,哪怕你是大牛,連面試的機會都沒有,豈不是開心的不行,往往我們的簡歷是有針對性的,對於不同的公司和不同的崗位,應聘騰訊後台,鼓吹阿裡和Java就是你的不對了……可是給每個公司都寫一份簡歷,那就不開心了,所以我們可以采用裝飾者模式

基本角色的實現
Component:
abstract class Component {
    public abstract  void print();
}

Decorator:

abstract class Decorator  extends Component{
    private Component component;

    Decorator( Component component ){
        this.component = component;
    }

    @Override
    public void print(){
        component.print();
    }
}

Concrete Component:

class Resume extends Component{
    @Override
    public void print() {
        System.out.println("My Name: llin\n"
                +"My Major: Software Engineering"
                +"My University: Tianjin University"
        );
    }
}

Concrete Decorator:

class AliDecrator extends Decorator{

    AliDecrator(Component component) {
        super(component);
    }

    @Override
    public void print() {
        super.print();
        System.out.println("I want a position at Ali major in Java");
    }
}

class TencentDecorator extends Decorator{

    TencentDecorator(Component component) {
        super(component);
    }

    @Override
    public void print(){
        super.print();
        System.out.println("I want a position at QQ major in C++");
    }
}

測試用類:

public class decoratorEg {
    public static void main ( String [] args ){
        Component resume = new Resume();
        Component aliResume = new AliDecrator( resume );
        Component QQResume = new TencentDecorator( resume );
        aliResume.print();
        System.out.println("");
        QQResume.print();
    }
}

測試結果如下:(其實在大量拓展,大量排列組合時才能更好地凸顯出Decorator模式的優勢)
這裡寫圖片描述

Decorator的應用場景

裝飾類和被裝飾類可以獨立發展,而不會互相耦合,所以具有易維護的特性 相對於繼承,能夠有效地防止子類爆炸,具有易拓展性易復用性 裝飾者模式是繼承關系的一種替代方案,我們通過例子可以看出,裝飾之後返回的依然是Component的接口,實現的是一個is-a的關系

Java I/O中的Decorator模式

在InputStream和OutputStream上添加各種功能,類似緩存、文件讀入等等一系列功能拓充都是Decorator模式下的產物

Decorator和Adapter兩種模式的比較

兩種模式都是包裝模式,都是起到包裝一個對象或類的作用 適配器的意義在於將一個接口包裝成另一個接口,它的目的是通過改變接口達到重復使用的作用 裝飾器不改變對象的接口,而是恰恰要保持原來的接口,但是增強原有對象的功能,或改變原有對象的處理方法而提升性能。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved