原則: "更多的考慮用對象組合機制,而不是用對象繼承機制". 更多的重用。

幾種模式的區別:
adapter 意圖是把已經有的部件,adapt 過來,到一個需要不同接口的部件。
bridge 的意圖是讓 abstract. 以及 implementor 可以用在更多的地方。 (費這么大勁,目的就是重用)
proxy 的意圖是在proxy 中搞點什么。

下面是在junit 中run 一段別人的代碼,演示bridge 模式。


import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import junit.framework.TestCase;


public class Bridge  extends TestCase{
     
    public void testbridge(){
       
        Reporter reporter=new HTMLReporter();
        Report report=new StockListReport(reporter);
        report.addReportItem("microsoft");
        report.addReportItem("google");
        String s= report.report();
        System.out.print("report: "+s);
       
    }
   
   
}


abstract class Report
{
    Reporter reporter;
    public Report(Reporter reporter) {
        this.reporter = reporter;
}
//抽象類使用橋接對象的方法來實現一個任務
    public void addReportItem(Object item){
        reporter.addLine(item.toString());
    }
    public void addReportItems(List items){
        Iterator iterator = items.iterator();
        while ( iterator.hasNext() )
        {
            reporter.addLine(iterator.next().toString());
        }
    }
    public String report(){
        return reporter.getReport();
    }
}

 class StockListReport extends Report{
    ArrayList stock=new ArrayList();
    public StockListReport(Reporter reporter){
        super(reporter);
    }
    public void addStockItem(String stockName){
        stock.add(stockName);
        addReportItem(stockName);
    }
}
//實現層次的抽象父類定義原子方法,供抽象層次的類調用
 abstract class Reporter{
    String header = "";
    String trailer = "";
    String report = "";
    public abstract void addLine(String line);
    public void setHeader(String header){
        this.header = header;
    }
    public void setTrailer(String trailer){
        this.trailer = trailer;
    }
    public String getReport(){
        return header+report+trailer;
    }
}
 class HTMLReporter extends Reporter{ 
    public HTMLReporter(){
        setHeader("<HTML>\n<HEAD></HEAD>\n<BODY>\n");
        setTrailer("</BODY>\n</HTML>");
    }
    public void addLine(String line){
        report += line + "<BR>\n";
    }
}
 class ASCIIReporter extends Reporter{
    public void addLine(String line) {
        report += line + "\n";
    }
}






西津渡