設計模式——裝飾者模式

從例子開始講解,好比今天你要出門約會,你確定是要決定好你要穿什麼樣的衣服出門,用衣服來裝飾下本身,讓本身擁有一個完美的約會。好比,你會穿一件襯衫,而後穿一件西服褲,最後穿皮鞋出門。這就是裝飾者模式的一個例子。爲了實現這個功能,會有下面的代碼。設計模式

一、代碼路一發

public class People {  
      
    public void wearShirt(){  
        System.out.println("******穿襯衫******");  
    }  
      
    public void wearTrouser(){  
        System.out.println("******穿西服褲******");  
    }  
      
    public void wearShoes(){  
        System.out.println("******穿皮鞋******");  
    }  
}
public class Client {  
      
        public static void main(String[] args) {  
            People people = new People();  
            people.wearShirt();  
            people.wearTrouser();  
            people.wearShoes();  
      
        }  
      
    }

雖然上面的代碼實現了出門穿衣服的功能,可是這裏會問題。若是我如今要增長一個功能,我要先穿襪子,再穿皮鞋。此時就要在People類中增長一個穿襪子的方法。這就違背了設計模式的開閉原則,所謂開閉原則就是類能夠進行擴展,可是不能夠進行修改。因此就有以下的設計:ide

二、代碼路一發

public interface People {  
          
        public void wearClothing();  
          
    }
public class Xiaoming implements People{  
          
        private String name;  
          
        public Xiaoming(){  
            name = "小明";  
        }  
        public void wearClothing(){  
            System.out.println(name+"******開始穿衣服******");  
        }  
        public String getName() {  
            return name;  
        }  
          
    }
public abstract class Finery implements People {  
      
    protected People people;  
      
    public Finery(People people){  
        this.people = people;  
    }  
    public abstract void wearClothing();  
}
public class ShirtFinery extends Finery {  
      
        public ShirtFinery(People people){  
            super(people);  
        }  
        @Override  
        public void wearClothing() {  
            people.wearClothing();  
            System.out.println("******穿襯衫******");  
        }  
      
    }
public class ShoesFinery extends Finery {  
  
    public ShoesFinery(People people){  
        super(people);  
    }  
    @Override  
    public void wearClothing() {  
        people.wearClothing();  
        System.out.println("******穿皮鞋*******");  
    }  
      
}
public class TrouserFinery extends Finery {  
  
    public TrouserFinery(People people){  
        super(people);  
    }  
    @Override  
    public void wearClothing() {  
        people.wearClothing();  
        System.out.println("******穿西服褲*******");  
    }  
      
}
public class Client {  
      
        public static void main(String[] args) {  
            People people = new Xiaoming();  
            Finery shirtFinery = new ShirtFinery(people);  
            Finery trouserFinery = new TrouserFinery(shirtFinery);  
            Finery shoesFinery = new ShoesFinery(trouserFinery);  
            shoesFinery.wearClothing();  
        }  
      
    }

三、其結構圖以下:

輸入圖片說明

4 、描述

裝飾者模式共有四大角色:this

Component:抽象組件設計

能夠是一個接口或者是抽象類,其充當的就是被裝飾的原始對象,用來定義裝飾者和被裝飾者的基本行爲。code

ConcreteComponent:組件具體實現類對象

該類是 Component 類的基本實現,也是咱們裝飾的具體對象。繼承

Decorator:抽象裝飾者接口

裝飾組件對象,其內部必定要有一個指向組件對象的引用。在大多數狀況下,該類爲抽象類,須要根據不一樣的裝飾邏輯實現不一樣的具體子類。固然,若是是裝飾邏輯單一,只有一個的狀況下咱們能夠忽略該類直接做爲具體的裝飾者。圖片

ConcreteDecoratorA 和 ConcreteDecoratorB:裝飾者具體實現類對抽象裝飾者的具體實現。get

在已有的 Component 和 ConcreteComponent 體系下,實現裝飾者模式來擴展原有系統的功能,能夠分爲

5 個步驟

  • 繼承或者實現 Component 組件,生成一個 Decorator 裝飾者抽象類;
  • 在生成的這個 Decorator 裝飾者類中,增長一個 Component 的私有成員對象;
  • 將 ConcreteComponent 或者其餘須要被裝飾的對象傳入 Decorator 類中並賦值給上一步的 Component 對象;
  • 在裝飾者 Decorator 類中,將全部的操做都替換成該 Component 對象的對應操做;
  • 在 ConcreteDecorator 類中,根據須要對應覆蓋須要重寫的方法。

5 、總結

People是定義了一個接口,用來添加具體的職責,而Xiaoming是具體的People,也就是被裝飾的對象。對於Finery實現了People接口,進而對People進行擴展,而Finery的子類就是具體的裝飾類,Finery中依賴People類,裝飾的具體對象。 這就是所謂的裝飾者模式。若是我要添加穿襪子的步驟,則只須要再添加一個實現類,徹底不須要修改其餘代碼(Client是客戶端類,確定是要修改的)。

相關文章
相關標籤/搜索