原则: "更多的考虑用对象组合机制,而不是用对象继承机制". 更多的重用。
几种模式的区别:
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";
}
}
西津渡