java抽象類與介面——設計模式

weixin_34221276發表於2017-02-22

1、工廠模式

先看程式1:


package com.java.abs;

interface Fruit {// 定義一個介面水果
	public void eat();
}

class Apple implements Fruit {

	public void eat() {
		System.out.println("吃蘋果");
	}

}

class Orange implements Fruit {

	public void eat() {
		System.out.println("吃橘子");
	}

}

public class InterfaceCaseDemo1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Fruit f = new Apple();// 例項化介面
		f.eat();
	}

分析程式碼:主方法應該表示一個客戶端,主方法的程式碼越少越好,此時,直接在主方法中指定了解要操作的子類,如果要更換子類,就要修改客戶端,就表示跟特定的子類緊密耦合在一起了。

JVM的工作原理:程式→JVM→作業系統

圖1圖1


此過渡段就稱為工廠設計


改進後的程式

package com.java.abs;

interface Fruit {// 定義一個介面水果
	public void eat();
}

class Apple implements Fruit {

	public void eat() {
		System.out.println("吃蘋果");
	}

}

class Orange implements Fruit {

	public void eat() {
		System.out.println("吃橘子");
	}

}

class Factory {// 定義工廠類
	public static Fruit getInstance(String className) {
		Fruit f = null;
		if ("Apple".equalsIgnoreCase(className)) {
			/*
			 * 一般字串比較,不寫成className.equalsIgnoreCase("Apple")
			 * 因為className為空時,空的物件無法呼叫方法,即產生空指標異常!
			 */
			f = new Apple();
		}
		if ("Orange".equalsIgnoreCase(className)) {
			f = new Orange();
		}
		return f;
	}
}

public class InterfaceCaseDemo1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Fruit f = Factory.getInstance(args[0]);// 例項化介面args[0]通過初始化引數設定。在dos下執行才可以設定
		if (f != null) {
			f.eat();
		}
	}
}
2、代理模式

package com.java.abs;
interface Network {
	public void browse();
}


class Real implements Network {
	public void browse() {
		System.out.println("上網瀏覽資訊");
	}
}


class Proxy implements Network {
	private Network network;// 代理物件


	public Proxy(Network network) {
		this.network = network;
	}


	public void check() {
		System.out.println("檢查使用者身份是否合法");
	}


	public void browse() {
		this.check();
		this.network.browse();// 呼叫真是的主題操作
	}
}


public class InterfaceCaseDemo2 {


	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Network net = null;
		net = new Proxy(new Real());// 制定代理操作    構造方法的引數是 new Real
		net.browse();
	}


}
圖2圖2


3、介面卡模式(多用於java圖形化介面)
對於java程式來說:如果要實現一個介面,則肯定要覆寫介面中的全部抽象方法,那麼如果,介面中方法太多,但是子類有用不到那麼多的抽象方法,則很麻煩,此時需要一箇中間過渡,但是此過渡類有不希望被直接使用,所以將此過渡類定義成抽象類比較合適,即一個介面首先被一個抽象類(稱作介面卡類),並在此抽象類中實現若方法(方法體為空),則以後的子類直接繼承此抽象類,就可以有選擇的覆寫所需要的方法了。

圖3圖3


package com.java.extend;

interface Windows {
	public void open();

	public void close();

	public void activated();

	public void iconified();

	public void deiconified();

}

abstract class WindowAdapter {
	public void open() {
	}

	public void close() {
	}

	public void activated() {
	}

	public void iconified() {
	}

	public void deiconified() {
	}
}

class WindowsImpl extends WindowAdapter {

	public void open() {
		System.out.println("開啟視窗");
	}

	public void close() {
		System.out.println("關閉視窗");
	}
}

public class AdapterDemo {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		WindowsImpl wd = new WindowsImpl();
		wd.open();
		wd.close();
	}
}

抽象類與介面雜談——內部類的擴充套件

在一個抽象類中定義一個介面,用內部類來繼承並實現內部介面。反之,在一個介面中也可以定義一個抽象類程式2,但是實際中並不常見!

程式1:

package com.java.extend;

abstract class A2 {
	public abstract void printA();

	interface B {
		public void printB();
	}
}

class X extends A2 {
	public void printA() {
		System.out.println("列印A1");
	}

	class Y implements B {
		public void printB() {
			System.out.println("列印B");
		}
	}
}

public class InnerExtend extends X {
	public static void main(String args[]) {
		A2.B b = new X().new Y();
		b.printB();
	}
}

程式2

package com.java.extend;


interface AA {
	public abstract void printA();


	abstract class B {
		public abstract void printB();
	}
}


class X1 implements AA {
	public void printA() {
		System.out.println("列印A1");
	}


	class Y extends B {
		public void printB() {
			System.out.println("列印B");
		}
	}
}


public class InnerExtend2 extends X1 {
	public static void main(String args[]) {
		B b = new X1().new Y();
		b.printB();
	}
}

抽象類和介面的關係

圖4

介面和抽象類是使用普通子類,子類必須覆寫全部抽象方法,寫出方法體;

相關文章