从类的实现中分离出抽象或者接口类,以便于这两个类能够互不相干,这种模式称作桥接模式。这种类型模式属于结构设计模式之一, 它通过提供了一个桥结构来分离具体的实现类和抽象类。
适用场合和优势:
public interface DrawAPI { public void drawCircle(int radius, int x, int y); }
它的子类RedCircle、GreedCircle。
public class RedCircle implements DrawAPI { @Override public void drawCircle(int radius, int x, int y) { System.out.println("Drawing Circle[ color: red, radius: " + radius +", x: " +x+", "+ y +"]"); } }
public class GreenCircle implements DrawAPI { @Override public void drawCircle(int radius, int x, int y) { System.out.println("Drawing Circle[ color: green, radius: " + radius +", x: " +x+", "+ y +"]"); } }
public abstract class Shape { protected DrawAPI drawAPI; protected Shape(DrawAPI drawAPI){ this.drawAPI = drawAPI; } public abstract void draw(); }
抽象类的子类.
public class Circle extends Shape { private int x, y, radius; public Circle(int x, int y, int radius, DrawAPI drawAPI) { super(drawAPI); this.x = x; this.y = y; this.radius = radius; } public void draw() { drawAPI.drawCircle(radius,x,y); } }
测试代码如下:
public class BridgePatternDemo { public static void main(String[] args) { Shape redCircle = new Circle(100,100, 10, new RedCircle()); Shape greenCircle = new Circle(100,100, 10, new GreenCircle()); redCircle.draw(); greenCircle.draw(); } }
测试结果:
Drawing Circle[ color: red, radius: 10, x: 100, 100] Drawing Circle[ color: green, radius: 10, x: 100, 100]
时间线展示工具Timeline[1],可以实现网页上展示一个时间轴。在时间相关的数据展示中,有比较好的效果。测试了下,具体的用法是这样的。
1.编写html页面,引入JS脚本,引入JSON数据,设定待显示日历位置<scriptsrc=/blog_article/"http_/static.simile.mit.edu/timeline/api-2.3.0/timeline-api.js>
<scriptsrc=/blog_article/"local_data2.js" type="text/javascript"></script>
<divid='tl'></div>
2.编写加载函数,并在网页中调用该函数<script>
var tl;
function onLoad() {
var tl_el =document.getElementById("tl");
var eventSource1 = newTimeline.DefaultEventSource();
var theme1 =Timeline.ClassicTheme.create();
theme1.autoWidth = true; // Set theTimeline's "width" automatically.
// SetautoWidth on the Timeline's first band's theme,
// willaffect all bands.
theme1.timeline_start = newDate(Date.UTC(1980, 0, 1));
theme1.timeline_stop = new Date(Date.UTC(2150, 0, 1));
var d =Timeline.DateTime.parseGregorianDateTime("1980")
var bandInfos = [
Timeline.createBandInfo({
width: 45, // set to a minimum, autoWidthwill then adjust
intervalUnit: Timeline.DateTime.DECADE,
intervalPixels: 200,
eventSource: eventSource1,
date: d,
theme: theme1,
layout: 'original' // original, overview, detailed
})
];
// create the Timeline
tl = Timeline.create(tl_el,bandInfos, Timeline.HORIZONTAL);
var url = '.'; // The base url forimage, icon and background image
// references in thedata
eventSource1.loadJSON(timeline_data, url); // The data was stored intothe
// timeline_data variable.
tl.layout(); // display theTimeline
}
var resizeTimerID = null;
function onResize() {
if (resizeTimerID == null) {
resizeTimerID =window.setTimeout(function() {
resizeTimerID = null;
tl.layout();
}, 500);
}
}
</script>
调用该函数:<body onload="onLoad();"onresize="onResize();">
3.编写包含事件的JSON文件vartimeline_data = { // save as a globalvariable
'dateTimeFormat':'iso8601',
'wikiURL':"http://simile.mit.edu/shelf/",
'wikiSection':"Simile Cubism Timeline",
'events' : [
{'start': '1987',
'title': 'Birthday of gongqingkui',
'description': 'This is description',
'image':'http://portrait7.sinaimg.cn/1150968582/blog/180',
'link':'http://blog.sina.com.cn/gongqingkui',
'icon' :"dark-red-circle.png",
'color' : 'red',
'textColor' : 'green'
},
{'start':'1986',
'end':'1990',
'isDuration':true,
'title':'aaa',
//'tapeImage': 'blue_stripes.png',
'tapeRepeat': 'repeat-x',
'caption': "This is the event'scaption attribute.",
'classname': 'hot_event'
},
]
}
该JSON数据目前包括一个点事件和一个段时间。
4.加载效果
这是最简单的使用方法,一些详细的例子在这里http://simile-widgets.org/timeline/examples/index.html。与这个相似的一个应用timeplot[2]可以画时间相关的数据直方图,效果如下。
参考
1.Timeline项目主页http://simile-widgets.org/timeline/
2.Timeplot项目主页http://simile-widgets.org/timeplot/
如果你做了一段时间的面向对象编程,并且写过类继承的代码,那么你百分之八十写过模板的设计模式,只是写的时候不知道这个简单的写法竟然是一个设计模式。有没有曾经写过类似这样的继承结构,定义了一个基类,它有一些virtual函数又有一些nonevirtual函数,继承类肯定要对virtual函数进行重写,当然对nonevirtual函数不能重写,这就是模板模式。
模板模式是将一些固定的流程或者业务在基类中定义好(以nonevirtual存在,因为继承类也要使用这些方法),不固定的在继承类中去实现(当然这些是virtual方法),这样就达到了最大限度的重用代码,但是还有更重要的作用:
1. 基类定义好了业务流程,这个业务流程就是nonevirtual函数进行支撑的,因为nonevirtual函数的业务逻辑无法修改,继承类只需要根据自己的独特性质实现virtual函数;