原则: "更多的考虑用对象组合机制,而不是用对象继承机制". 更多的重用。

几种模式的区别:
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";
    }
}






西津渡