原則: "更多的考慮用對象組合機制,而不是用對象繼承機制". 更多的重用。
幾種模式的區別:
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";
}
}
西津渡