1. 程式人生 > 實用技巧 >(四)FFT在時序資料上的應用

(四)FFT在時序資料上的應用

定義:又稱為部分-整體模式,它是一種將物件組合成樹狀的層次結構的模式,用來表示”部分-整體“的關係,使使用者對當個物件和組合物件具有一致的訪問性

優點

1,組合模式使得客戶端程式碼可以一致地處理單個物件和組合物件,無需擔心自己處理的是單個物件,還是組合物件,這簡化了客戶端程式碼

2,更容易在組合體內加入新的物件,客戶端不會因為加入了新的物件而更改原始碼,滿足”開閉原則“

缺點

1,設計比較複雜,客戶需要花費更多時間清理類之間的層次關係。

2,不容易限制容器的構件。

3,不容易使用繼承的關係來增加構件的新功能。

模式的結構

1,抽象構件角色:它主要是為樹葉構件和樹枝構件宣告公共介面,並實現他們的預設行為,在透明的組合模式中抽象構件還宣告訪問和管理子類的介面;在安全式的組合模式中不宣告訪問和管理子類的介面,管理工作由樹枝工作完成。

2,樹葉構件角色:是組合中的葉節點物件,它沒有子節點,用於構件角色中宣告的公共介面

3,樹枝構件角色:是組合中的分支節點物件,它有子節點,它實現了抽象構件角色中的宣告介面,它的主要作用是儲存和管理子部件,通常包含add(),remove(),getchildren()等方法

組合模式分為透明模式和安全模式

透明模式:在該方式中,由於抽象構件聲明瞭所有子類中的全部方法,所以客服端無需區別樹葉物件和樹枝物件,對客戶端來說是透明的,缺點是樹葉構件本來沒有Add(),Remove(),GetChild()方法,卻要實現它們,這樣會帶來一些安全性問題

安全模式:在該方式中,將管理子構件的方法移到樹枝構件中,抽象構件和樹葉構件沒有對子物件的管理方法,這樣就避免了上一種方式的安全性問題,但由於葉子和分支有不同的介面,客戶端在呼叫時要知道樹葉物件的存在,所以失去了透明性

程式碼

package composite;
import java.util.ArrayList;
public class CompositePattern
{
    public static void main(String[] args)
    {
        Component c0=new Composite(); 
        Component c1=new Composite(); 
        Component leaf1=new Leaf("1"); 
        Component leaf2=new Leaf("2"); 
        Component leaf3=new Leaf("3");          
        c0.add(leaf1); 
        c0.add(c1);
        c1.add(leaf2); 
        c1.add(leaf3);          
        c0.operation(); 
    }
}
//抽象構件
interface Component
{
    public void add(Component c);
    public void remove(Component c);
    public Component getChild(int i);
    public void operation();
}
//樹葉構件
class Leaf implements Component
{
    private String name;
    public Leaf(String name)
    {
        this.name=name;
    }
    public void add(Component c){ }           
    public void remove(Component c){ }   
    public Component getChild(int i)
    {
        return null;
    }   
    public void operation()
    {
        System.out.println("樹葉"+name+":被訪問!"); 
    }
}
//樹枝構件
class Composite implements Component
{
    private ArrayList<Component> children=new ArrayList<Component>();   
    public void add(Component c)
    {
        children.add(c);
    }   
    public void remove(Component c)
    {
        children.remove(c);
    }   
    public Component getChild(int i)
    {
        return children.get(i);
    }   
    public void operation()
    {
        for(Object obj:children)
        {
            ((Component)obj).operation();
        }
    }    
}