1. 程式人生 > >Java——模板設計模式和列舉類的實現

Java——模板設計模式和列舉類的實現

嘗試以MarkdownPad2方式寫部落格,感覺十分有條理,第一次使用花的時間較長,但是熟能生巧,後面會越用越熟練,更快吧~

1. 模板設計模式

(1).模板方法模式就是定義一個演算法的骨架,而將具體的演算法延遲到子類來實現

(2)優點:使用模板方法模式,在定義演算法骨架的同時,可以很靈活的實現具體的演算法,滿足使用者靈活多變的需求

(3)缺點:如果演算法骨架有修改的話,則需要修改抽象類

    實現程式碼~

package pra_25;
public class J_48 {
	public static void main(String[] args) {
		songetTime st=new songetTime();
		System.out.println(st.getTime());
	}

}
abstract class getTime{
	public final long getTime(){
		long s=System.currentTimeMillis();
		code();
		long e=System.currentTimeMillis();
		return e-s;
	}

	public abstract void code();
}
class songetTime extends getTime{

	@Override
	public void code() {
		int i=0;
		while(i<10000){
			System.out.println(i);
			i++;
		}
	}
	
}

2.列舉類

          列舉:是指將變數的值都列出來,變數的值只限於列舉出來的值的範圍內。如:一週只有七天。

列舉類的注意事項:

1)定義列舉類要用關鍵字enum
2)所有列舉類都是用Enum的子類
3)列舉類的第一行上必須是列舉項,最後一個列舉項後的分號是可以省略的,但是如果列舉類有其他的東西,這個分號就不能省略
4)列舉類可以有構造器。但必須是private的,它預設的也是private
5)列舉類也可以有抽象方法,但是列舉項必須重寫該方法
6)列舉在switch語句中可以使用

自定義實現列舉類:

package pra_25;
public class J_49 {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//列舉方式1.空參構造
		Week mon=Week.Mon;
		Week tue=Week.Tue;
		System.out.println(mon);
		
		//列舉方式2.有參構造
		Week2 mon2=Week2.Mon;
		System.out.println(mon2.getName());
		
		//列舉方式3.加了抽象類,抽象方法,只能定義一個匿名內部類,然後重寫其方法
		Week3 mon3=Week3.Mon;
		mon3.show();
	}
}
class Week{		//私有構造,不讓其他類建立本類物件
	public static final Week Mon=new Week();
	public static final Week Tue=new Week();
	private Week(){
		
	}
}
class Week2{		//私有構造,不讓其他類建立本類物件
	public static final Week2 Mon=new Week2("週一");
	public static final Week2 Tue=new Week2("週二");
	private String name;
	private Week2(String name){
		this.name=name;
	}
	public String getName() {
		return name;
	}
}
abstract class Week3{		//私有構造,不讓其他類建立本類物件
	public static final Week3 Mon=new Week3("週一"){
		public void show(){
			System.out.println("週一");
		}
	};
	public static final Week3 Tue=new Week3("週二"){
		public void show(){
			System.out.println("週二");
		}
	};
	private String name;
	private Week3(String name){
		this.name=name;
	}
	public String getName() {
		return name;
	}
	public abstract void show();
}

通過enum實現列舉類

package pra_25;
public class J_50 {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//無參
		Month j=Month.Jan;
		System.out.println(j); 	//Jan
		
		//有參
		Month2 f=Month2.Feb;
		System.out.println(f.getName());
		
		//方法
		Month3 m=Month3.Mar;
		m.show();
	}

}
//列舉方式1
enum Month{
	Jan,Feb,Mar;	//空參構造
}
//列舉方式2
enum Month2{
	Jan("一月"),Feb("二月"),Mar("三月");	
	private String name;
	private Month2(String name){
		this.name=name;
	}
	public String getName() {
		return name;
	}
}
//列舉方式3
enum Month3{
	Jan("一月"){
		public void show(){
			System.out.println("一月");
		}
	},Feb("二月"){
		public void show(){
			System.out.println("二月");
		}
	},Mar("三月"){
		public void show(){
			System.out.println("三月");
		}
	};	
	private String name;
	private Month3(String name){
		this.name=name;
	}
	public String getName() {
		return name;
	}
	public abstract void show();
}

列舉類的常見方法

int ordinal()
int compareTo(E o)
String name()
String toString()
<T> T valueOf(Class<T> type,String name)
values()

這裡注意一下:因為尖括號或出現問題,所以這裡建議用&lt對<>進行處理

package pra_25;
import pra_25.J_50;
public class J_51 {
	public static void main(String[] args) {
		Month2 J=Month2.Jan;
		Month2 F=Month2.Feb;
		//列舉項都是由編號的
		System.out.println(J.ordinal());//0
		System.out.println(F.ordinal());//1
		//比較的是編號
		System.out.println(J.compareTo(F));	//-1
		//獲取例項的名稱
		System.out.println(J.name()); //Jan
		//通過位元組碼物件,獲取列舉項
		Month2 j2=Month2.valueOf(Month2.class,"Jan");
		System.out.println(j2);	
		//獲取每一個列舉項
		Month2[] arr=Month2.values();
		for (Month2 month2 : arr) {
			System.out.println(month2);
		}
	}
}