隨筆-19  評(píng)論-2  文章-1  trackbacks-0
            2005年7月31日
          模板模式:
                 
                   模板方法中分兩種方法:一種是模板方法,另一種是基本方法。
                   模板方法:就是把基本方法組合在一起形成一個(gè)總算法或則總行為,這個(gè)模板方法一般會(huì)在抽象定義并且在子類種不加以修改的繼承下來。一個(gè)抽象類可以有任意多個(gè)模板方法。
                   基本方法:它又分為抽象方法,具體方法,鉤子方法。
                抽象方法由抽象類申明,由子類具體實(shí)現(xiàn);具體方法由抽象類申明并實(shí)現(xiàn),而子類并不實(shí)現(xiàn)或則置換,這里面也可以有工廠方法;鉤子方法,由抽象類申明并實(shí)現(xiàn),但是它是一個(gè)空的實(shí)現(xiàn),一般都是由子類進(jìn)行擴(kuò)張實(shí)現(xiàn)。
          posted @ 2005-08-19 21:15 sky 閱讀(375) | 評(píng)論 (0)編輯 收藏


          import java.io.*;

          public class FileRead{
           private static double totalFile = 0;
           private static double totalDirectory = 0;

           public String replace(String value){
               StringBuffer replace = new StringBuffer(value);
               int i = 0;
               int last = replace.lastIndexOf("──");
               i = replace.indexOf("──");
               while((i != last)&&(i != -1)){
                   replace.replace(i,i+"──".length(),"   ");
                   i = replace.indexOf("──");
                   last = replace.lastIndexOf("──");
               }
               return replace.toString();
           }

           public void searchFile(File f,String value,boolean b)throws IOException{
               StringBuffer string = new StringBuffer(value);
               string.append("──");
               boolean bool = b;
            String path = f.getAbsolutePath();
            File currentFile = new File(path); //取得當(dāng)前路徑的文件
            File[] file = currentFile.listFiles();

            for(int i=0;i<file.length;i++){      
                StringBuffer s = null;
                String lastDirectory = null; 
               
                /*
                 * 判斷文件夾是否為該目錄下的最后一個(gè)文件夾,如果是的話,則取消打印"│"符號(hào)
                 */
                for(int k=0;k<file.length;k++){
                 if(file[k].isDirectory())
                  lastDirectory = new String(file[k].getName()); 
                }
                if(file[i].getName().equals(lastDirectory)){
                 if(string.indexOf("│") != -1){
                     string.delete(string.lastIndexOf("│"),string.lastIndexOf("│")+1);
                 }
                }
                 
                /*
                 * 格式化打印,將符號(hào)最后的"──"變?yōu)?├──"(當(dāng)最后的符號(hào)不為"│──"時(shí))
                 */     
                if(!((string.lastIndexOf("──")-1) == string.lastIndexOf("│──"))){
                    s = new StringBuffer(string.substring(0,string.lastIndexOf("──")));
                 s.append("├──");         
                }else{
                 if(string.indexOf("│──")!=-1){
                  s = new StringBuffer(string.substring(0,string.lastIndexOf("│──")));
                  s.append("├──");
                 }
                }
               
                if(file[i].getName().equals(file[file.length-1].getName()))
                 if(s != null)
                  if(s.lastIndexOf("├") != -1)
                   s.replace(s.lastIndexOf("├"),s.lastIndexOf("├")+1,"└");
               
                /*
                 * 如果s不為空,則將s傳入方法replace中進(jìn)行格式化
                 */
                if(s != null)           
                 System.out.println(replace(s.toString()) + file[i].getName());
                     
             if(file[i].isDirectory()){   
                 totalDirectory  += 1;
                  
                 /*
                  * 如果該文件夾的子目錄下還有兩個(gè)以上的文件和文件夾,則打印一個(gè)"│"符號(hào),并標(biāo)記bool為true
                  */
                     String pathstring = file[i].getAbsolutePath();
               File current = new File(pathstring); //取得當(dāng)前路徑的文件
               File[] fp = current.listFiles();
               if(fp.length >1){
                   bool = true;                  
               }
              
                 if(bool)
                  string.append("│");
                
                 searchFile(file[i],string.toString(),bool);
                
                 /*
                  * 如果bool已經(jīng)被標(biāo)記過,則將上一次的"│"符號(hào)刪除
                  */
                 if(bool)
                  if(string.indexOf("│") != -1)
                      string.delete(string.lastIndexOf("│"),string.length());
                 bool = false; 
             }
             totalFile += 1; 
            }
           } 
           public static void main(String args[])throws IOException{
            String path = null;
            if(args.length<1)
             path =".";
            else
             path = args[0];
            FileRead read = new FileRead();
            File file = new File(path);
            
            if(!file.exists()){
             System.err.print("the path is error");
             System.exit(1);
            } 
            read.searchFile(file,"│",false);
            System.out.println("the file is :" + (totalFile-totalDirectory));
            System.out.println("thd directory is : " + totalDirectory);
           }
          }

          該程序存在一個(gè)問題,也就是當(dāng)jdk中的File類無法判斷目錄下的一些目錄是文件夾或則是文件時(shí)?

          posted @ 2005-08-19 20:20 sky 閱讀(579) | 評(píng)論 (0)編輯 收藏
          策略模式:

                  策略模式的對(duì)算法的包裝,是把使用算法的責(zé)任和算法本生分開,委派給不同的對(duì)象管理。策略模式通常把一個(gè)系列的算法包裝到一系列的策略類里面,作為一個(gè)抽象策略類的子類。
          使用條件:
                  如果在一個(gè)系統(tǒng)種有許多類,他們之間的區(qū)別僅僅在于他們的行為,并且這個(gè)系統(tǒng)需要?jiǎng)討B(tài)的在幾種算法種選擇一種。       
          posted @ 2005-08-14 23:51 sky 閱讀(193) | 評(píng)論 (0)編輯 收藏
          不變模式:
                 
                  不變模式可以增強(qiáng)對(duì)象的強(qiáng)壯性,不變模式準(zhǔn)許多個(gè)對(duì)象共享一個(gè)對(duì)象,這降低了對(duì)該對(duì)象進(jìn)行并發(fā)訪問時(shí)的同步化開銷。如果要修改一個(gè)不變對(duì)象的狀態(tài),則需要?jiǎng)?chuàng)建一個(gè)新的對(duì)象,并將其存入新的對(duì)象里。不變模式只涉及到一個(gè)類,一個(gè)類的內(nèi)部狀態(tài)一旦被創(chuàng)建以后,在整個(gè)期間都不會(huì)發(fā)生變化。他有兩種一種是強(qiáng)不變模式和弱不變模式。
                  弱不變模式:
          首先滿足沒有方法可以改變對(duì)象的狀態(tài),則對(duì)象一旦被創(chuàng)建之后,對(duì)象的狀態(tài)就不會(huì)改變。二該對(duì)象的所有的屬性都是私有的,并且不準(zhǔn)許聲明任何公有的方法來改變他們。三這個(gè)對(duì)象所引用的對(duì)象也應(yīng)該是不變的對(duì)象,如果在初始化時(shí)應(yīng)用了一個(gè)可變的對(duì)象,則應(yīng)該對(duì)該可變對(duì)象進(jìn)行復(fù)制一份,而不要使用原來的拷貝。這種模式的缺點(diǎn)是他可以用子類,并且子類可以是可變的對(duì)象。可變的子類可能一修改父類對(duì)象的狀態(tài),從而可能會(huì)允許外界修改父對(duì)象的狀態(tài)。

          問題:
                 為什么說可變的對(duì)象可以修該父類對(duì)象的狀態(tài)呢?怎樣做?

          強(qiáng)不變模式首先要滿足弱不變模式,然后將這個(gè)類聲明成final類,則它變不可能有子類了,并且也將該對(duì)象所考慮到的所有方法聲明為final。
          不變模式與享元模式有很大的相同處,他們的對(duì)象狀態(tài)都有要求不隨環(huán)境的變化而變化,不過享元模式的內(nèi)涵狀態(tài)在不影響享元對(duì)象的共享時(shí),可以為可變的。不變模式對(duì)對(duì)象的要求要比享元模式對(duì)對(duì)象的要求更嚴(yán)格。


          posted @ 2005-08-14 23:39 sky 閱讀(644) | 評(píng)論 (2)編輯 收藏
          橋梁模式:
             
                  橋梁模式就是抽象化和實(shí)現(xiàn)化脫藕,使得兩者可以獨(dú)立地變法。例子如java中的peer架構(gòu)。
                  橋梁模式與適配器模式的區(qū)別是,
          posted @ 2005-08-12 23:28 sky 閱讀(333) | 評(píng)論 (0)編輯 收藏
          門面模式:
                  在外界訪問要訪問多個(gè)內(nèi)部系統(tǒng)時(shí),并且他與這些內(nèi)部系統(tǒng)有著復(fù)雜的關(guān)系時(shí),我們則可以用門面模式來解決這樣的問題。
                   門面模式他只是提供一個(gè)可以共外界方便訪問內(nèi)部子系統(tǒng)的一個(gè)接口,他并不會(huì)對(duì)子系統(tǒng)進(jìn)行擴(kuò)展,他只提供子系統(tǒng)所具有的方法。對(duì)外界來說,他是一個(gè)子系統(tǒng),但是內(nèi)部的子系統(tǒng)并不知道有這么一個(gè)類。例如:一個(gè)學(xué)生要去圖書館借書,這里有3個(gè)表,rule是記錄不同的讀者的借書規(guī)則(如研究生可以借7而本科生只能借4本),publish表是記錄過期未還書的學(xué)生,passwork是記錄圖書館所頒發(fā)過的借書證。如果一個(gè)學(xué)生要借書,則他必須要有一個(gè)在passwork中存在的借書證,并且沒有在publish中的情況,則可以保證向該學(xué)生提供借閱,但是借閱的書則要按rule中的規(guī)則來進(jìn)行。所以一個(gè)學(xué)生client借書必須訪問這些類,為了便于管理,我們提供一個(gè)  FacadeFactory類來處理,這個(gè)類提供了所有client向子系統(tǒng)訪問的方法。這樣對(duì)于client來說就輕松多了,也便于我們維護(hù)代碼了。但是FacadeFactory不能夠向client提供內(nèi)部子系統(tǒng)不存在的方法。
                  由于一個(gè)系統(tǒng)中所需要的只需要一個(gè)實(shí)例,則我們可以把門面類設(shè)置為單例類,如上面的FacadeFactory,他應(yīng)該設(shè)置為一個(gè)單例類,這樣就不會(huì)發(fā)生多個(gè)人同時(shí)借一本書了。
                 
          posted @ 2005-08-12 19:38 sky 閱讀(235) | 評(píng)論 (0)編輯 收藏

          享元模式:flyweight pattern

               享元模式包括兩種狀態(tài),內(nèi)蘊(yùn)狀態(tài)和外蘊(yùn)狀態(tài)。他的種類有單純享元模式和復(fù)合享元模式,結(jié)構(gòu)圖如下:

          我們從結(jié)構(gòu)種可以看出,復(fù)合享元模式是由單純享元模式和合成模式組合而成的。

          享元模式有四種角色:抽象享元角色,具體享元角色,享元工廠角色,和客戶角色。享元模式中的享元工廠角色可以通過單例模式來實(shí)現(xiàn)。

          使用條件:

              一個(gè)系統(tǒng)中有大量的對(duì)象,這些對(duì)象消耗大量的內(nèi)存,這些對(duì)象大部份是可以外部化的,這些對(duì)象可以按照內(nèi)蘊(yùn)狀態(tài)分成很多的組,當(dāng)把外蘊(yùn)對(duì)象從對(duì)象中踢除時(shí),每一個(gè)組都可以僅用一個(gè)對(duì)象代替,軟件系統(tǒng)不依賴這些對(duì)象的身份,換言之,這些對(duì)象可以是不可分辨的。不過他要使用一個(gè)維護(hù)記錄了系統(tǒng)已有的所以享元的表,而這需要消耗資源。因此應(yīng)當(dāng)在有足夠多的享元的實(shí)例可提供共享實(shí)才值得使用享元模式。
          posted @ 2005-08-11 22:37 sky 閱讀(266) | 評(píng)論 (0)編輯 收藏

             裝飾模式

                  他的各個(gè)角色的作用為:抽象角色:給出一個(gè)抽象的接口,以規(guī)范準(zhǔn)備接收附加責(zé)任的對(duì)象。

                  具體角色:定義一個(gè)將要接收附加責(zé)任的類。

                  裝飾角色:持有一個(gè)構(gòu)件對(duì)象的實(shí)例,并定義一個(gè)雨抽象接口一致的接口。

                  具體裝飾角色:負(fù)責(zé)給構(gòu)件對(duì)象“貼上”附加責(zé)任。

          裝飾類一般在以下情況使用:

          1、  需要擴(kuò)展一個(gè)類的功能,或給一個(gè)類增加附加責(zé)任。

          2、  需要?jiǎng)討B(tài)的給一個(gè)對(duì)象增加功能,這些功能可以再動(dòng)態(tài)的測銷。

          3、  需要增加由一些基本的排列組合產(chǎn)生非常大量的功能,從而使繼承關(guān)系變得不現(xiàn)實(shí)。          

              

          他有很多特點(diǎn):

          1、  裝飾模式雨繼承關(guān)系的目的都是要擴(kuò)展對(duì)象的功能,但是裝飾模式可以提供比繼承更多的靈活性。裝飾模式準(zhǔn)系統(tǒng)動(dòng)態(tài)的決定“貼上”一個(gè)需要的“裝飾”,或者除掉一個(gè)不需要的裝飾。而繼承則不同,繼承關(guān)系是靜態(tài)的,他在系統(tǒng)運(yùn)行前就決定了。

          2、  他可以通過使用不同的具體修飾類以及這些裝飾類的排例組合,設(shè)計(jì)可以創(chuàng)造更多不同行為的組合。     

          3、  他雖然比繼承性要靈活,這意味著他比繼承更容易出錯(cuò)。

          缺點(diǎn):由于使用裝飾模式可以比使用繼承關(guān)系需要較少數(shù)目的類,但是在另一方面,使用裝飾模式會(huì)產(chǎn)生比使用繼承方式更多的對(duì)象。這在使用時(shí)進(jìn)行錯(cuò)誤查詢變得更困難了,特別是這些對(duì)象看上去都很像。

           

          posted @ 2005-08-11 22:36 sky 閱讀(239) | 評(píng)論 (0)編輯 收藏

          import java.util.*;

          class BookName{
           String name;
           int number;
          }
          abstract class Note{
           BookName name = new BookName();
           abstract public void setName(String value);
           abstract public int getNumber();
           abstract public void setNumber(int value);
           abstract public String getName();

          class StudentNote extends Note implements Cloneable{
           BookName name = new BookName();
           int isbn;
           public void setName(String value){
            name.name = value;
           }
           public void setNumber(int i){
            name.number = i;
           }
           public int getNumber(){
            return name.number;
           }
           public String getName(){
            return name.name;
           }
           public Object clone() throws CloneNotSupportedException{
            StudentNote st = new StudentNote();
            st = (StudentNote)super.clone();
            st.name = new BookName();
            st.name.name = name.name;
            st.name.number = name.number;
            return st;
           }
           public void setIsbn(int i){
            isbn = i;
           }
           public int getIsbn(){return isbn;}
          }
          class Manager{
           private Vector v = new Vector();
           
           public void add(Note note){
            v.addElement(note);
           }
           public Note get(int i){
            return (Note)v.get(i);
           }
           public int size(){
            return v.size();
           }
          }

          class Client{
           private StudentNote student;
           private static Manager client = new Manager();
           public void register()throws CloneNotSupportedException{
            student = new StudentNote();
            StudentNote st = (StudentNote)student.clone();
            client.add(st);
           }
           public static Manager getInstance(){
            return client;
           }

          }

          class test{ 
           public static void main(String[] args)throws CloneNotSupportedException {
            Client c = new Client();
            c.register(); 
            c.register();
            Manager manager = c.getInstance();
            StudentNote student = (StudentNote)manager.get(0);
            StudentNote st = (StudentNote)manager.get(1);
            student.setName("sky");
            student.setNumber(101);
            student.setIsbn(10001);
            st.setName("fly");
            st.setNumber(102);
            st.setIsbn(10002);
            System.out.println(student.getName() + "\t" + student.getNumber() + "\t" + student.getIsbn());
            System.out.println(st.getName() + "\t" + st.getNumber() + "\t" + st.getIsbn());
           }
          }

          posted @ 2005-08-09 13:03 sky 閱讀(213) | 評(píng)論 (0)編輯 收藏

            <java與模式> ---電子書 page 425

           

          裝飾模式—Decorator

          裝飾模式有名包裝模式,裝飾模式以對(duì)客戶端透明的方式來擴(kuò)展對(duì)象的功能,是繼承關(guān)系的一個(gè)替代的方案。

          客戶端并不會(huì)覺得裝飾模式在裝飾前和裝飾后有什么不同,他可以在不使用更多的子類的情況下來進(jìn)行對(duì)對(duì)象的功能加以擴(kuò)展。結(jié)構(gòu)圖如下:

          裝飾模式原來被裝飾類的一個(gè)子類的實(shí)例,把客戶端的調(diào)用委派到被裝飾類。他有以下組成:抽象構(gòu)件,具體構(gòu)件,裝飾角色,具體裝飾;他一般在下面這些情況使用他最好:

          1、  需要擴(kuò)展一個(gè)類的功能,或給一個(gè)類增加附加責(zé)任。

          2、  需要?jiǎng)討B(tài)的給一個(gè)對(duì)象增加功能,這些功能可能被動(dòng)態(tài)的撤消。

          3、  需要增加一些基本功能的排例組合而產(chǎn)生的非常大量的功能,從而使繼承關(guān)系變得不現(xiàn)實(shí)。

          優(yōu)點(diǎn):他可以靈活的增加一個(gè)類或?qū)ο蟮墓δ埽部梢酝ㄟ^不同的具體裝飾類的排例組合設(shè)計(jì)出更加復(fù)雜的,功能更強(qiáng)的類。

          缺點(diǎn):他雖然增加了一個(gè)類的靈活性,但同時(shí)他也給一個(gè)類的管理帶來了復(fù)雜性。
          posted @ 2005-08-03 00:00 sky 閱讀(212) | 評(píng)論 (0)編輯 收藏

          import java.io.*;

          public class FileRead{
           private static int space=0;
           private static double totalFile = 0;
           private static double totalDirectory = 0;
           
           public String printSpace(int space){
            String str = "";
            for(int i=0;i<space;i++)
             str += "    ";
            return str; 
           }

           public void searchFile(File f)throws IOException{
            String path = f.getAbsolutePath();
            File currentFile = new File(path); //取得當(dāng)前路徑的文件
            File[] file = currentFile.listFiles();
            
            space++;

            for(int i=0;i<file.length;i++){
             System.out.println(printSpace(space) + file[i].getName());
             if(file[i].isDirectory()){
              totalDirectory  += 1;
              searchFile(file[i]);
              if(space>0)
               space--;   
             }
             totalFile += 1; 
            }
           } 
           public static void main(String args[])throws IOException{
            String path = null;
            if(args.length<1)
             path =".";
            else
             path = args[0];
            FileRead read = new FileRead();
            File file = new File(path);
            
            if(!file.exists()){
             System.err.print("the path is error");
             System.exit(1);
            } 
            read.searchFile(file);
            System.out.println("the file is :" + (totalFile-totalDirectory));
            System.out.println("thd directory is : " + totalDirectory);
           }
          }
          這個(gè)程序在便歷多文件時(shí)會(huì)出現(xiàn)問題?不知道問題在哪里?

          合成模式
                  合成模式他是一種樹型結(jié)構(gòu),他可以通過對(duì)合成的圖的單獨(dú)部分方法達(dá)到對(duì)整個(gè)合成圖方法問。他由三部分組成,抽象構(gòu)件—Component和樹枝構(gòu)件—Composite以及樹葉構(gòu)件Leaf。合成模式分為兩種,一種是透明式的。另一個(gè)是安全式的合成模式。
                   透明式的合成模式和安全式的合成模式,他們的組成成分都一樣,他們的區(qū)別是:透明式的合成模式,他在抽象構(gòu)件種增加了操作子類對(duì)象的一些接口,這樣在實(shí)現(xiàn)的過程中,無論是樹枝構(gòu)件還是樹葉構(gòu)件都必須實(shí)現(xiàn)這些接口,這對(duì)樹葉構(gòu)件來說,這種接口實(shí)現(xiàn)是多余的,所以樹葉構(gòu)件是通過平庸式的方式來實(shí)現(xiàn),這種實(shí)現(xiàn),將造成編譯時(shí)可以通過,但是當(dāng)用戶在應(yīng)用的過程過如果調(diào)用這些方法,將造成運(yùn)行時(shí)的錯(cuò)誤,這就造成了程序的不安全;而安全式的合成模式,他并沒有在抽象構(gòu)件實(shí)現(xiàn)對(duì)子結(jié)點(diǎn)接口的申明,他是通過樹枝直接對(duì)管理子類所需要的方法進(jìn)行申明,這就給程序帶來靈活性,但是也給程序帶來不便的管理性,這種實(shí)現(xiàn)使得程序不會(huì)出現(xiàn)運(yùn)行時(shí)的錯(cuò)誤。
                   一般我們?cè)谶@樣的情況下應(yīng)用合成模式:
                            1、當(dāng)我們要體現(xiàn)構(gòu)件的部分和整體的結(jié)構(gòu)時(shí)。
                            2、當(dāng)我們要要忽略個(gè)體構(gòu)件與整體構(gòu)件的區(qū)別時(shí),并且要平等的對(duì)待個(gè)體構(gòu)件和整體構(gòu)件時(shí)。
                   使用合成構(gòu)件有以下好處:
                            1、使用合成模式可以很容易的增加新構(gòu)件的種類。
                            2、使用合成模式方便了用戶對(duì)構(gòu)件的使用,因?yàn)樗麄儾挥脫?dān)心使用的是樹頁構(gòu)件還是樹枝構(gòu)件。
                   他的缺點(diǎn):使用合成模式之后在控制樹枝構(gòu)件的類型就不是那么容易了。

          posted @ 2005-08-02 01:56 sky 閱讀(177) | 評(píng)論 (0)編輯 收藏

                                                                                                                

                <java與模式> ---電子書

           

          結(jié)構(gòu)模式(Structural Pattern)描述的是類和對(duì)象結(jié)合在一起行成的更大的結(jié)構(gòu)。分為類的結(jié)構(gòu)模式和對(duì)象的結(jié)構(gòu)的結(jié)構(gòu)模式。類的結(jié)構(gòu)模式如:適配器模式,對(duì)象的結(jié)構(gòu)模式:代理人模式。

          結(jié)構(gòu)模式:合成模式、享元模式、裝飾模式、適配器模式、缺省適配器模式、代理模式、門面模式、橋梁模式

           

          適配器模式與缺省適配器模式——Adapter Default Adapter  page349 22

           

          適配器模式就是把一個(gè)類的接口變換成客戶端所期待的接口,從而使原來因接口不匹配而無法在一起工作的兩個(gè)類可以在一起工作。它有兩種模式,一種是類的適配器模式,一種叫對(duì)象的適配器模式。

           

          模式中三種角色:

          1、  目標(biāo)角色:這就是客戶端所期待的接口。

          2、  源角色:現(xiàn)有的適配接口。

          3、  適配器角色:它負(fù)責(zé)叫源接口轉(zhuǎn)換成目標(biāo)接口。

          類適配器一般用的是繼承的方式來實(shí)現(xiàn)的,但對(duì)象適配器是用的委派。其中對(duì)象適配器比起類配器有一些優(yōu)勢,它可以將不同源適配到同一個(gè)目標(biāo),它甚至可以適配同一個(gè)源和它的子類,這對(duì)類適配器來說很難的。(類適配器就要先做一個(gè)源類的子類,然后將源類的子類進(jìn)行適配)

           

          系統(tǒng)在什么時(shí)候使用適配器:

          1、  系統(tǒng)需要使用現(xiàn)有的類,而此類的接口有不符合系統(tǒng)的要求。

          2、  想成立一個(gè)可以重復(fù)使用的類,用于將那些之間沒有太大的關(guān)系的類一起工作。

           

           

          缺省適配器模式:它和適配器模式幾乎相同,它的作用也和適配器的作用一樣,它是適配器模式中的一種特殊的模式。其中的適配器類是一個(gè)平庸化的類,它是一個(gè)抽象類,但是它實(shí)現(xiàn)了從源接口中繼承的所有方法,如果不存在適配類的子類,那么適配類就沒有意義。如:WindowListener 的適配類WindowsAdapter

          J2SE中的缺省適配器模式

           

          posted @ 2005-07-31 21:47 sky 閱讀(121) | 評(píng)論 (0)編輯 收藏
          主站蜘蛛池模板: 香格里拉县| SHOW| 武功县| 桂林市| 佛坪县| 莱阳市| 库尔勒市| 浦县| 遵义市| 合阳县| 三门县| 天台县| 安达市| 鄢陵县| 平江县| 合阳县| 安龙县| 潜江市| 马山县| 云霄县| 望奎县| 桦甸市| 青河县| 崇左市| 西乌珠穆沁旗| 朝阳县| 绥江县| 石棉县| 抚顺市| 乐山市| 馆陶县| 兴业县| 文安县| 海阳市| 宜川县| 浑源县| 英山县| 合作市| 塔城市| 沙雅县| 博野县|