程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> 裝飾模式圖解

裝飾模式圖解

編輯:JAVA編程入門知識

                                       裝飾模式


  • 裝飾模式:一種常見的模式,動態地給一個對象添加一些額外的職責,就增加功能來看,裝飾模式比生成子類更加靈活。
  • 裝飾模式的通用類圖如下:

    •  Component抽象構件:Component是一個接口或者是抽象類,就是我們需要裝飾的核心對象。在裝飾模式中,必然有一個最基本、最核心、最原始的接口或抽象類充當Component構件。
    • ConcreteComponent是Component接口或抽象類的實現。
    • Decrator裝飾角色:一般是一個抽象類,實現接口或者抽象方法,其屬性必然有一個private變量指向Component抽象構件。
    • ConcreteDecrator具體裝飾類。

其通用類圖源碼如下:

  • public abstract class Component {
        public abstract void doSomething();
    }
    
    public class ConcreteComponent extends Component{
        @Override
        public void doSomething() {
            // TODO Auto-generated method stub
            System.out.println("this is a ConcreteComponent");
        }
    }
    
    public abstract class Decrator extends Component{
        private Component component = null;
        public Decrator(Component com){
            this.component = com;
        }
        @Override
        public void doSomething(){
            this.component.doSomething();
        }
    }
    
    public class ConcreteDecrator1 extends Decrator{
    
        public ConcreteDecrator1(Component com) {
            super(com);
            // TODO Auto-generated constructor stub
        }
        public void doSomething() {
            // TODO Auto-generated method stub
            this.method1();
            super.doSomething();
        }
        private void method1(){
            System.out.println("this is a ConcreteDecrator");
        }
    }
    
    public class ConcreteDecrator2 extends Decrator{
    
        public ConcreteDecrator2(Component com) {
            super(com);
            // TODO Auto-generated constructor stub
        }
        public void doSomething(){
            super.doSomething();
            this.method2();
        }
        private void method2(){
            System.out.println("this is another ConcreteDecrator");
        }
    }
    
    public class Client {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Component component = new ConcreteComponent();
            component = new ConcreteDecrator1(component);
            component = new ConcreteDecrator2(component);
            component.doSomething();
        }
    }
    View Code 裝飾模式的應用

    最近剛剛過了雙十一的網上購物狂潮,購買的商品也萬裡迢迢的飛奔而來,拿到快遞那一刻的喜悅簡直感覺自己就是世界上最幸福的,然而如果你買的是服裝,相信你一定深有體會,為什麼自己穿上就沒有那種感覺了呢,冥思苦想,應該是商家對服裝的裝飾比較到位,下面我們就解析一下這種“差距”。

  • 首先我們先看一下類圖:

 

    • Clothes類是一個抽象類,是我們在網上看到的各種服裝的總稱,它有一個展示其參數的方法parameter(),提供給買家參考。
    • Coat類是服裝中的具體的一件上衣。
    • Decrator是抽象的裝飾類,其中包括一個Clothes對象。
    • Model具體裝飾類,讓時裝模特穿上這個外套。
    • Scarf具體的裝飾類,為外套裝飾一條圍巾。
    • 如下是類圖的通用源碼實現:
  • public abstract class Clothes {
        //展示服裝信息
        public abstract void parameter();
    }
    
    public class Coat extends Clothes{
        @Override
        public void parameter() {
            // TODO Auto-generated method stub
            System.out.println("this is a Coat");
            System.out.println("It's size is XL");
            System.out.println("It's color is dark blue");
        }
    }
    
    public abstract class Decrator extends Clothes{
        private Clothes clothes = null;
        public Decrator(Clothes clothes){
            this.clothes = clothes;
        }
        @Override
        public void parameter(){
            this.clothes.parameter();
        }
    }
    
    public class Model extends Decrator{
    
        public Model(Clothes clothes) {
            super(clothes);
            // TODO Auto-generated constructor stub
        }
        public void parameter(){
            this.method2();
            super.parameter();
        }
        private void method2(){
            System.out.println("A clothes model wears the coat");
        }
    }
    
    public class Scarf extends Decrator{
    
        public Scarf(Clothes clothes) {
            super(clothes);
            // TODO Auto-generated constructor stub
        }
        public void parameter() {
            // TODO Auto-generated method stub
            this.method1();
            super.parameter();
        }
        private void method1(){
            System.out.println("this is a scarf to decrate the coat");
        }
    }
    
    public class Client {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Clothes clothes = new Coat();
            clothes = new Scarf(clothes);
            clothes = new Model(clothes);
            clothes.parameter();
        }
    }
    View Code

    可憐了我們這些小白用戶,不知道還能這麼玩,藍瘦香菇。

裝飾模式的優點
  • 裝飾類和被裝飾類可以獨立發展,而不會相互耦合。如實例,服裝類Clothes不需要知道裝飾類Decrator,裝飾類是從外部來擴展服裝類的,而裝飾類也不用知道具體的服裝類。
  • 裝飾模式是一種繼承關系的替代方案,裝飾類Decrator不管裝飾多少層,返回的對象還是Clothes,實現的還是is-a的關系。
  • 裝飾類可以動態擴展一個實現類的功能。如上述例子中,上衣有多個子類(Jacket、Shirt等),如果開發到中途,需求提出要改動Coat類,那可能對Coat的子類產生影響,而此時可以用裝飾模式,通過建立CoatDecrator來修飾Coat類,相當於創建了一個新類,原有程序沒有變更,通過擴展滿足了需求。
裝飾模式的缺點
  • 多層裝飾比較復雜,需要盡量減少裝飾類的數量,以便降低系統的復雜度。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved