百度地图经纬度转换+反地址解析+显示可视区域内标注点+地图自动刷新+标注的聚合

一:代码简介

本次主要将百度地图的经纬度转换,反地址解析,显示可视区域内的标注点,Markers聚合等整合到了同一个jsp页面上;旨在实现在经纬度未转换的情况下,页面自动实现百度经纬度转换,添加标注点。当用户点击标注点时,开始进行反地址解析,并检索该点周围区域内的最多3个关键点,一并予以显示。本次经纬度转换采取了百度的单个经纬度转换的方法,因为需要给标注点添加对应的信息,而百度提供的批量转换经纬度的方法会导致经纬度顺序错乱,无法使标注点与信息对应。同时,代码提供了地图页面自动刷新的方法,关于自动刷新,本人采用了setTimeout延时器,关于清除setTimeout延时器这块本人不是很精通,无法将延时器全部清除,所以此次采用的方法比较笨拙,还请大家见谅,望高手多多指点下.另外还有Markers标注点聚合,这个就比较简单了。此外,这次jsp页面共包含了两个地图容器,可以通过按钮切换。

附注:本人在地图上还添加了判断点击是地图还是覆盖物事件,如果点击到覆盖物,将无法拖动地图,需再次点击地图才可拖动地图移动。


二:功能预览

1.地图容器

(1).Markers聚合

2).定位页面

2.反地址解析

3.显示可视区域内的标注点(通过监视地图移动、缩放开始,移动结束和地图缩放开始、结束来触发,2秒后执行方法)


4.地图自动刷新

5.Markers聚合

三、示例代码:

========================全部源码===========================================

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<title>多车实时定位</title>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=1.3"></script>
<script type="text/javascript" src="http://developer.baidu.com/map/jsdemo/demo/convertor.js"></script>
<script type="text/javascript" src="http://api.map.baidu.com/library/GeoUtils/1.2/src/GeoUtils_min.js"></script>
     <script type="text/javascript" src="http://api.map.baidu.com/library/TextIconOverlay/1.2/src/TextIconOverlay_min.js"></script>
<script type="text/javascript" src="http://api.map.baidu.com/library/MarkerClusterer/1.2/src/MarkerClusterer_min.js"></script>
     <script type="text/javascript" src="js/jquery-1.4.4.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
<style>
.style1{
width: 400px;
height: 120px;
margin: 0px auto;
margin-bottom:20px;
border:1px solid #96C2F1;
background-color: #EFF7FF
}
</style>
    <script type="text/javascript">
var t="";
    var tt2='';
    
    function end(){
tt2=setTimeout(addMymarkers,2000); 
}
function cle(){
clearTimeout(tt2);
}

    var t1='';var t2='';var t3='';var t4='';var t5='';var t6='';var t7='';var t8='';var t9='';var t10='';
    var t11='';var t12='';var t13='';var t14='';var t15='';var t16='';var t17='';var t18='';var t19='';var t20='';
    var t21='';

var JHt='';

function nextJH(){

JHt=setTimeout(function(){


refreshJH();
},20000);
}
    
    var secs =120; //倒计时的秒数 
    
     function nextTrans2(){
     
     var text1 = document.getElementById("text1").value;
var text2= document.getElementById("text2").value;
if(text1!=""||text2!=""){
X2.Eval("var pdnextTrans2 = 0");
document.getElementById("ShowDiv2").style.display="block";
    //for(var i=secs;i>=0;i--){ 
// t=setTimeout('doUpdate(' + i + ')',(secs-i) * 1000); 
///}

     t1=setTimeout('doUpdate('+20+')',0 * 1000);
    t2=setTimeout('doUpdate('+19+')',1 * 1000);
t3=setTimeout('doUpdate('+18+')',2 * 1000);
t4=setTimeout('doUpdate('+17+')',3 * 1000);
t5=setTimeout('doUpdate('+16+')',4 * 1000);
t6=setTimeout('doUpdate('+15+')',5 * 1000);
t7=setTimeout('doUpdate('+14+')',6 * 1000);
t8=setTimeout('doUpdate('+13+')',7 * 1000);
t9=setTimeout('doUpdate('+12+')',8 * 1000);
t10=setTimeout('doUpdate('+11+')',9 * 1000);
t11=setTimeout('doUpdate('+10+')',10 * 1000);

t12=setTimeout('doUpdate('+9+')',11 * 1000);
t13=setTimeout('doUpdate('+8+')',12 * 1000);
t14=setTimeout('doUpdate('+7+')',13 * 1000);
t15=setTimeout('doUpdate('+6+')',14 * 1000);
t16=setTimeout('doUpdate('+5+')',15 * 1000);
t17=setTimeout('doUpdate('+4+')',16 * 1000);
t18=setTimeout('doUpdate('+3+')',17 * 1000);
t19=setTimeout('doUpdate('+2+')',18 * 1000);
t20=setTimeout('doUpdate('+1+')',19 * 1000);
t21=setTimeout('doUpdate('+0+')',20 * 1000);


}else{
alert("对不起,您选中任何车辆,请选择相应车辆......");
}


}

function doUpdate(num){ 
document.getElementById('ShowDiv2').innerHTML = '<font color=red>'+num+'</font>秒后自动刷新<input  type="button" value="停止" onclick="StopnextTrans2();"/><input type="button" value="车辆分布" onclick="JHmap()" /><input type="button" value="车辆追踪" onclick="Lmap()" />' ; 
if(num == 0) { post(); } 
}

function StopnextTrans2(){
X2.Eval("var pdnextTrans2 = 1");
//for(var i=40;i>=0;i--){
// clearTimeout(t);
//}
clearTimeout(t1);clearTimeout(t2);clearTimeout(t3);clearTimeout(t4);clearTimeout(t5);clearTimeout(t6);clearTimeout(t7);clearTimeout(t8);clearTimeout(t9);clearTimeout(t10);
clearTimeout(t11);clearTimeout(t12);clearTimeout(t13);clearTimeout(t14);clearTimeout(t15);clearTimeout(t16);clearTimeout(t17);clearTimeout(t18);clearTimeout(t19);clearTimeout(t20);clearTimeout(t21);

document.getElementById('ShowDiv2').innerHTML = '<input type="button" value="开始自动定位" onclick="location2()" /><input type="button" value="车辆分布" onclick="JHmap()" /><input type="button" value="车辆追踪" onclick="Lmap()" />';

}
    
    function post() {

var points=document.getElementById("text1").value;
var infomation=document.getElementById("text2").value;


if(points!="" && infomation!=""){

points = points.substring(0,points.length-1);
var points2="'points':["+points+"]";

infomation = infomation.substring(0,infomation.length-1);
var infomation2="'infomation':["+infomation+"]";

var dstr3="'is_gps' : 3";
var dszhong=" "+points2+","+infomation2+","+dstr3+" ";

eval("var data3 = {"+ dszhong +"}");

map.clearOverlays();
for(i=0;i<data3.points.length;i++){
gpsxy(data3.points[i].lng,data3.points[i].lat,data3.infomation[i].vehiclelic,data3.infomation[i].terminal,data3.infomation[i].velocity,data3.infomation[i].direction,data3.infomation[i].datetime,data3.infomation[i].isonline,data3.infomation[i].height,data3.infomation[i].mileage,data3.is_gps);
}

if(pdnextTrans2==0){
nextTrans2();
}

}else{
document.getElementById('ShowDiv2').innerHTML = '<input type="button" value="开始自动定位" onclick="location2()" /><input type="button" value="车辆分布" onclick="JHmap()" /><input type="button" value="车辆追踪" onclick="Lmap()" />';
alert("对不起,你所选的车辆从数据库中被删除或不存在,请您核实后再定位...");
} 
}

    function refreshJH() {

var text1 = document.getElementById("text1").value;
var text2= document.getElementById("text2").value;
var dstr3 = document.getElementById("text3").value;

if(text1!="" && text2!=""){

text1 = text1.substring(0,text1.length-1);
var points2="'points':["+text1+"]";

text2 = text2.substring(0,text2.length-1);
var infomation2="'infomation':["+text2+"]";

var dstr3="'is_gps' : 3";
var dszhong=" "+points2+","+dstr3+" ";

eval("var data3 = {"+ dszhong +"}");

map2.clearOverlays();

juhe(data3);

nextJH();

}else{

alert("对不起,你所选的车辆从数据库中被删除或不存在,请您核实后再定位...");
} 
}
    
    </script>

<script type="text/javascript">

var X2 = {}

X2.Eval = function(code) {

if (!!(window.attachEvent && !window.opera)) {

execScript(code);

} else {

window.eval(code);
}
}
X2.Eval("var pdnextTrans2 = 1");
        
function addMymarkers(){

var text1 = document.getElementById("text1").value;
var text2= document.getElementById("text2").value;
var dstr3 = document.getElementById("text3").value;

if(text1!=""||text2!=""){

var dstr = "'points':[";
var lastIndex = text1.lastIndexOf(',');
text1 = text1.substring(0,lastIndex);
dstr += text1;
dstr += "]";
var dstr2 = "'infomation':[";

var lastIndex2 = text2.lastIndexOf(',');
text2 = text2.substring(0,lastIndex2);
dstr2 += text2;
dstr2 += "]";

var dszhong = " " + dstr + "," + dstr2 + "," + dstr3 + " ";
$("#datastr").text(dszhong);
eval("var data3 = {" + dszhong + "}");
map.clearOverlays();

for(i=0;i<data3.points.length;i++){
gpsxy(data3.points[i].lng,data3.is_gps);
}
}
}


function addMarker22(str){

var addrall="";
var info="";
     var addr = str.split("*");
     for(var i=0;i<addr.length;i++){
     
     var addr2=addr[i];
     var addr3=addr2.split(".");
     var addr4=addr3[0];
     addrall+=addr4;
     }
document.getElementById('infoadds').innerHTML = addrall;
}


function ceshi() {

var text1 = document.getElementById("text1").value;
var text2= document.getElementById("text2").value;
var dstr3 = document.getElementById("text3").value;

if(text1!=""||text2!=""){

//#####开始拼装指定格式#####
var dstr = "'points':[";
//截取最后,

var lastIndex = text1.lastIndexOf(',lastIndex);
dstr += text1;
dstr += "]";
//###################
var dstr2 = "'infomation':[";

var lastIndex2 = text2.lastIndexOf(',lastIndex2);
dstr2 += text2;
dstr2 += "]";
//#####结束拼装指定格式####

var dszhong = " " + dstr + "," + dstr3 + " ";
eval("var data3 = {" + dszhong + "}");
map.clearOverlays();

for(i=0;i<data3.points.length;i++){
gpsxy(data3.points[i].lng,data3.is_gps);
}
}
}

function location2(){
var text1 = document.getElementById("text1").value;
var text2= document.getElementById("text2").value;
if(text1!=""||text2!=""){

nextTrans2(); 
}else{
alert("对不起,您未选中任何车辆,请选择相应车辆......");
//X2.Eval("var pdnextTrans2 = 1");
}

}

function JHmap(){
document.getElementById("JH_map").style.zIndex="0";
document.getElementById("load_map").style.zIndex="-1";
document.getElementById("ShowDiv").style.zIndex="0";
document.getElementById("ShowDiv2").style.zIndex="-1";
}
function Lmap(){
document.getElementById("JH_map").style.zIndex="-1";
document.getElementById("load_map").style.zIndex="0";
document.getElementById("ShowDiv").style.zIndex="-1";
document.getElementById("ShowDiv2").style.zIndex="0";
}

window.onload = refreshJH;
</script>

</head>
<body>
<div style="position: absolute;z-index: -5;">
<input type="text" name="text1" id="text1" value="{'lat':'36.68471','lng':'116.96866'},{'lat':'29.658484','lng':'91.121523'},{'lat':'43.817816','lng':'87.61647'},{'lat':'36.64095','lng':'101.757245'},{'lat':'30.682457','lng':'104.057625'},{'lat':'25.037929','lng':'102.699594'},{'lat':'45.76039','lng':'126.637684'},{'lat':'41.807471','lng':'123.458779'},{'lat':'23.109016','lng':'113.303839'},{'lat':'31.316628','lng':'120.606865'},{'lat':'37.119594','lng':'79.920327'}," />
<input type="text" name="text2" id="text2" value="{'vehiclelic':'鲁A*****','terminal':'****','velocity':'****','direction':'正北','datetime':'****','isonline':'0','height':'****','mileage':'****'},{'vehiclelic':'藏F*****','direction':'正南','isonline':'1',{'vehiclelic':'新A*****','direction':'正西',{'vehiclelic':'青H*****',{'vehiclelic':'川E*****','direction':'西北',{'vehiclelic':'云A*****',{'vehiclelic':'黑N*****',{'vehiclelic':'辽V*****','direction':'东南',{'vehiclelic':'粤A*****',{'vehiclelic':'苏L*****','direction':'东北',{'vehiclelic':'新R*****'," />
<input type="hidden" name="text3" id="text3" value="'is_gps' : 1" />
</div>

<div
style="position: absolute; z-index: -1; width: 100%; height: 100%; border: 0px solid gray; margin-right: 0px; bordercolor: ; margin-left: 0px; margin-top: 0px; margin-bottom: 0px;"
id="load_map">
<div class="loading">
地图加载中,请稍候...
</div>
</div>
<div
style="position: absolute; z-index: 0; width: 100%; height: 100%; border: 0px solid gray; margin-right: 0px; bordercolor: ; margin-left: 0px; margin-top: 0px; margin-bottom: 0px;"
id="JH_map">
<div class="loading">
地图加载中,请稍候...
</div>
</div>
<div STYLE="position:absolute;z-index:0;" id="ShowDiv">

<input type="button" value="车辆分布" onclick="JHmap()" />
<input type="button" value="车辆追踪" onclick="Lmap()" />
</div>
<div STYLE="position:absolute;z-index:-1;" id="ShowDiv2">
<input type="button" value="开始自动定位" onclick="location2()" />
<input type="button" value="车辆分布" onclick="JHmap()" />
<input type="button" value="车辆追踪" onclick="Lmap()" />
</div>
<script>
var map = new BMap.Map("load_map");
map.centerAndZoom(new BMap.Point(100.404,36.915),5);
map.addControl(new BMap.MapTypeControl()); 
map.enableScrollWheelZoom(); 
map.enableKeyboard(); 
var ctrl_nav = new BMap.NavigationControl( {
anchor : BMAP_ANCHOR_TOP_LEFT,type : BMAP_NAVIGATION_CONTROL_LARGE
});
map.addControl(ctrl_nav);
var ctrl_ove = new BMap.OverviewMapControl( {
anchor : BMAP_ANCHOR_BOTTOM_RIGHT,isOpen : 1
});
map.addControl(ctrl_ove);
var ctrl_sca = new BMap.ScaleControl( {
anchor : BMAP_ANCHOR_BOTTOM_LEFT
});
map.addControl(ctrl_sca);
map.addControl(new BMap.NavigationControl());

var map2 = new BMap.Map("JH_map");
map2.centerAndZoom(new BMap.Point(100.404,5);
map2.addControl(new BMap.MapTypeControl()); 
map2.enableScrollWheelZoom(); 
map2.enableKeyboard(); 
var ctrl_nav = new BMap.NavigationControl( {
anchor : BMAP_ANCHOR_TOP_LEFT,type : BMAP_NAVIGATION_CONTROL_LARGE
});
map2.addControl(ctrl_nav);
var ctrl_ove = new BMap.OverviewMapControl( {
anchor : BMAP_ANCHOR_BOTTOM_RIGHT,isOpen : 1
});
map2.addControl(ctrl_ove);
var ctrl_sca = new BMap.ScaleControl( {
anchor : BMAP_ANCHOR_BOTTOM_LEFT
});
map2.addControl(ctrl_sca);
map2.addControl(new BMap.NavigationControl());

function mapTrack() {
var obj = this;
this.getPoints = function() {
$("body").append('<span id="datastr" style="display:none;"></span>');
ceshi();
}
};

$(function() {
var map = new mapTrack();
var trans_points = $("#trans_all_points");
if (trans_points.size() == 0) {
map.getPoints();
} else {
map.track();
}
})

gpsxy = function (xx,yy,vehiclelic,terminal,velocity,direction,datetime,isonline,height,mileage,pd){

    var info="";
    if(isonline=='1'){
info="<div class='style1'><font color='red'>车牌号</font>:"+vehiclelic+"(在线)<font color='red'>终端SIM卡号</font>:"+terminal+"<font color='red'>速度</font>:"+velocity+"km/h<br/><font color='red'>行驶里程</font>:"+mileage+"km<font color='red'>方向</font>:"+direction+"<font color='red'>海拔高度</font>:"+height+"m<font color='red'>定位时间</font>:"+datetime+" <br/><font color='red'>地址</font>:<span id='infoadds'><img src='images/addrJDT.gif' /></span></div>";    //+addrall; 
}else if(isonline=='0'){
info="<div class='style1'><font color='red'>车牌号</font>:"+vehiclelic+"(离线)<font color='red'>终端SIM卡号</font>:"+terminal+"<font color='red'>速度</font>:"+velocity+"km/h<br/><font color='red'>行驶里程</font>:"+mileage+"km<font color='red'>方向</font>:"+direction+"<font color='red'>海拔高度</font>:"+height+"m<font color='red'>定位时间</font>:"+datetime+" <br/><font color='red'>地址</font>:<span id='infoadds'><img src='images/addrJDT.gif' /></span></div>";    //+addrall;
} 
     
    if(xx!=0.0||yy!=0.0){
    var gpsPoint = new BMap.Point(xx,yy);
    BMap.Convertor.translate(gpsPoint,translateCallback = function (point){
    
     var result = BMapLib.GeoUtils.isPointInRect(point,map.getBounds());
        if(result == true){
         var dire=direction;
     var dire2="";
     if(isonline=='1'){
          if(dire=='正东'){
     dire2='images/onlineyou.png';
     }else if(dire=='正西'){
     dire2='images/onlinezuo.png';
     }else if(dire=='正南'){
     dire2='images/onlinexia.png';
     }else if(dire=='正北'){
     dire2='images/onlineshang.png';
     }else if(dire=='东北'){
     dire2='images/onlinedb.png';
     }else if(dire=='西北'){
     dire2='images/onlinexb.png';
     }else if(dire=='东南'){
     dire2='images/onlinedn.png';
     }else if(dire=='西南'){
     dire2='images/onlinexn.png';
     }
     }else if(isonline=='0'){
     if(dire=='正东'){
     dire2='images/Nonlineyou.png';
     }else if(dire=='正西'){
     dire2='images/Nonlinezuo.png';
     }else if(dire=='正南'){
     dire2='images/Nonlinexia.png';
     }else if(dire=='正北'){
     dire2='images/Nonlineshang.png';
     }else if(dire=='东北'){
     dire2='images/Nonlinedb.png';
     }else if(dire=='西北'){
     dire2='images/Nonlinexb.png';
     }else if(dire=='东南'){
     dire2='images/Nonlinedn.png';
     }else if(dire=='西南'){
     dire2='images/Nonlinexn.png';
     }
     }
     
   var myIcon = new BMap.Icon(dire2,new BMap.Size(50,50),{
      offset: new BMap.Size(50,imageOffset: new BMap.Size(0,0)
    });
  
     var marker = new BMap.Marker(point,{icon: myIcon});
    
         var opts = {
       // 信息窗口宽度
   height: 100,// 信息窗口高度
   title : "<font size='4' color='#000000'><strong>车辆信息</strong></font>"
}
    
     if(pd==0){
   map.panTo(point);
   map.setZoom(15);
   }
    
     map.addOverlay(marker);
    
      var infoWindow = new BMap.InfoWindow(info,opts);  // 创建信息窗口对象
     infoWindow.setWidth(430);
  infoWindow.setHeight(130);
 
marker.addEventListener("click",function(){  


    this.openInfoWindow(infoWindow);  
      addallM2(point.lng,point.lat);
});
    
     //map.setCenter(point);   //设置地图中心点
    // marker.setAnimation(BMAP_ANIMATION_BOUNCE); //跳动的动画
    
     var label = new BMap.Label(vehiclelic,{offset:new BMap.Size(20,-10)});
     label.setStyle({color:'green',borderColor:'black'});
     marker.setLabel(label);
        }
}
    
    );
    }
}

function addallM2(pt2,pt21){
var gc = new BMap.Geocoder();
var pt = new BMap.Point(pt2,pt21);
var str = "";
var str2 = "";
var str3 = "";
gc.getLocation(pt,function(rs) {
var addComp = rs.addressComponents;
str2=addComp.province + "," + addComp.city + "," + addComp.district + "," + addComp.street + "," + addComp.streetNumber+"";
var allPois = rs.surroundingPois; 
if (allPois.length != 0) {
for (i = 0; i < allPois.length; ++i) {
var juli = map.getDistance(pt,allPois[i].point);
str += (i + 1) + "、离" + allPois[i].title + "("+ allPois[i].address + ")大约" + juli+ "*米 ";
str3 = str2 + str;
addMarker22(str3);
}
} else {
gc.getLocation(pt," + addComp.streetNumber+"";
var allPois = rs.surroundingPois; 
for (i = 0; i < allPois.length; ++i) {
var juli = map.getDistance(pt,allPois[i].point);
str += (i + 1) + "、离" + allPois[i].title + "("+ allPois[i].address + ")大约" + juli+ "*米 ";
str3 = str2 + str;
addMarker22(str3);
}
},mOption22);
}
},mOption21);
}
},mOption2);
}


function juhe(data){
var markers = [];

for(i=0;i<data.infomation.length;i++){

 var point = new BMap.Point(data.points[i].lng,data.points[i].lat);
 
var dire=data.infomation[i].direction;
     var dire2="";
     if(data.infomation[i].isonline=='1'){
          if(dire=='正东'){
     dire2='images/onlineyou.png';
     }else if(dire=='正西'){
     dire2='images/onlinezuo.png';
     }else if(dire=='正南'){
     dire2='images/onlinexia.png';
     }else if(dire=='正北'){
     dire2='images/onlineshang.png';
     }else if(dire=='东北'){
     dire2='images/onlinedb.png';
     }else if(dire=='西北'){
     dire2='images/onlinexb.png';
     }else if(dire=='东南'){
     dire2='images/onlinedn.png';
     }else if(dire=='西南'){
     dire2='images/onlinexn.png';
     }
     }else if(data.infomation[i].isonline=='0'){
     if(dire=='正东'){
     dire2='images/Nonlineyou.png';
     }else if(dire=='正西'){
     dire2='images/Nonlinezuo.png';
     }else if(dire=='正南'){
     dire2='images/Nonlinexia.png';
     }else if(dire=='正北'){
     dire2='images/Nonlineshang.png';
     }else if(dire=='东北'){
     dire2='images/Nonlinedb.png';
     }else if(dire=='西北'){
     dire2='images/Nonlinexb.png';
     }else if(dire=='东南'){
     dire2='images/Nonlinedn.png';
     }else if(dire=='西南'){
     dire2='images/Nonlinexn.png';
     }
     }
    
        
   var myIcon = new BMap.Icon(dire2,0)
    });

var marker2 = new BMap.Marker(point,{icon: myIcon});
       markers.push(marker2);
}

var markerClusterer = new BMapLib.MarkerClusterer(map2,{markers:markers});
//markerClusterer.hide();

}

map.addEventListener("zoomend",end);
map.addEventListener("moveend",end);
map.addEventListener("movestart",cle);
map.addEventListener("zoomstart",cle);
map.addEventListener("click",function(e){
     if(e.overlay){
         map.disableDragging(); 
     }else{
       map.enableDragging(); 
     }
 });

var mOption2 = {
poiRadius : 500,numPois : 3
}

var mOption21 = {
poiRadius : 3000,numPois : 3
}

var mOption22 = {
poiRadius : 6000,numPois : 3
}
</script>

</body>
</html>

==============================================全部源码==========================================


四.总结:

通过此次学习,本人发现百度地图转换经纬度很是慢,不管你采用单个转换还是批量转换。另外百度的Markers聚合也没有本人想象中的好用,虽然百度说如果超过150个标注点建议用Markers聚合,但页面依然不是很流畅,不过用谷歌浏览器效果会稍微好点。

以上就是本人本次的学习总结,写的不是很好,还请各路高手,大侠们多多指点,嘿嘿

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


什么是设计模式一套被反复使用、多数人知晓的、经过分类编目的、代码 设计经验 的总结;使用设计模式是为了 可重用 代码、让代码 更容易 被他人理解、保证代码 可靠性;设计模式使代码编制  真正工程化;设计模式使软件工程的 基石脉络, 如同大厦的结构一样;并不直接用来完成代码的编写,而是 描述 在各种不同情况下,要怎么解决问题的一种方案;能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免引
单一职责原则定义(Single Responsibility Principle,SRP)一个对象应该只包含 单一的职责,并且该职责被完整地封装在一个类中。Every  Object should have  a single responsibility, and that responsibility should be entirely encapsulated by t
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强烈推荐。原文截图*************************************************************************************************************************原文文本************
适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,它是针对软件开发中经常遇到的一些设计问题,总结出来的一套通用的解决方案。
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
迭代器模式提供了一种方法,用于遍历集合对象中的元素,而又不暴露其内部的细节。
外观模式又叫门面模式,它提供了一个统一的(高层)接口,用来访问子系统中的一群接口,使得子系统更容易使用。
单例模式(Singleton Design Pattern)保证一个类只能有一个实例,并提供一个全局访问点。
组合模式可以将对象组合成树形结构来表示“整体-部分”的层次结构,使得客户可以用一致的方式处理个别对象和对象组合。
装饰者模式能够更灵活的,动态的给对象添加其它功能,而不需要修改任何现有的底层代码。
观察者模式(Observer Design Pattern)定义了对象之间的一对多依赖,当对象状态改变的时候,所有依赖者都会自动收到通知。
代理模式为对象提供一个代理,来控制对该对象的访问。代理模式在不改变原始类代码的情况下,通过引入代理类来给原始类附加功能。
工厂模式(Factory Design Pattern)可细分为三种,分别是简单工厂,工厂方法和抽象工厂,它们都是为了更好的创建对象。
状态模式允许对象在内部状态改变时,改变它的行为,对象看起来好像改变了它的类。
命令模式将请求封装为对象,能够支持请求的排队执行、记录日志、撤销等功能。
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。 基本介绍 **意图:**在不破坏封装性的前提下,捕获一个对象的内部状态,并在该
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为
享元模式(Flyweight Pattern)(轻量级)(共享元素)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结