1. 程式人生 > >介面(工廠模式&代理模式)

介面(工廠模式&代理模式)

程式1:簡單的介面功能

package com.liaojianya.chapter2;
/**
 * 編寫程式實現一個usb介面,定義裝置來使用這個介面,從而計算機可以呼叫具有usb介面的裝置。
 * @author LIAO JIANYA
 * 2016年7月27日
 */
public class InterfaceStandards
{
	public static void main(String[] args)
	{
		Computer com = new Computer();
		com.plugin(new Flash());//在電腦上使用U盤
		com.plugin(new Print());//在電腦上使用印表機
	}

}
//定義USB介面標準
interface USB
{
	public void work();
}
//在電腦上使用具有USB介面的裝置
class Computer
{
	public void plugin(USB usb)
	{
		usb.work();
	}
}
//印表機實現USB介面標準
class Print implements USB
{
	public void work()
	{
		System.out.println("印表機用USB介面,連線開始工作");
	}
}
//U盤實現USB介面標準
class Flash implements USB
{
	public void work()
	{
		System.out.println("U盤使用USB介面,連線開始工作");
	}
}

  執行結果:

U盤使用USB介面,連線開始工作
印表機用USB介面,連線開始工作

  分析:

  按照固定的USB介面標準,可以定義無數多個子類,並且這些子類可以在電腦上使用。

  程式2:工廠模式

package com.liaojianya.chapter2;
/**
 * 
 * @author LIAO JIANYA
 * 2016年7月27日
 */
public class SimpleFactoryTest
{
	public static void main(String[] args)
	{
		Animal an = Factory.getInstance("lion");
		an.behaviour();
		an = Factory.getInstance("bird");
		an.behaviour();
	}

}
//定義一個動物標準
interface Animal
{
	public void behaviour();
}

class Lion implements Animal
{
	public void behaviour()
	{
		System.out.println("獅子跑");
	}
}

class Bird implements Animal
{
	public void behaviour()
	{
		System.out.println("鳥兒飛");
	}
}
class Factory
{
	public static Animal getInstance(String className)
	{
		if("lion".equals(className))
		{
			return new Lion();
		}
		if("bird".equals(className))
		{
			return new Bird();
		}
		return null;
	}
}

  執行結果:

獅子跑
鳥兒飛

  分析:

  1)根據引數的內容例項化不同的子類,引數內容為“lion”,例項化的就是Lion類,引數內容為“bird”,例項化的就是Bird類,所以輸出內容也不同。

  2)此時的程式,客戶端沒有呵呵具體的子類耦合在一起,這樣,如果再有更多的Animal介面的子類粗線,只需要修改Factory類即可,即所有的介面物件都是通過Factory類取得。

  程式3:代理設計模式

package com.liaojianya.chapter2;
/**
 * 設計代理模式,用紅酒廠商、代理商、客戶來闡釋代理的作用
 * @author LIAO JIANYA
 * 2016年7月27日
 */
public class ProxyTest
{
	public static void main(String[] args)
	{
		Subject sub = new ProxySubject();//客戶直接找代理,子類為介面例項化
		sub.request();
	}

}
//代理請求
abstract class Subject
{
	abstract public void request();
}
//真實角色(紅酒廠商)
class RealSubject extends Subject
{
	public void request()
	{
		System.out.println("我是紅酒廠商,歡迎品嚐購買!");
	}
}
//代理角色(代理商)
class ProxySubject extends Subject
{
	private RealSubject realSubject;
	public void request()
	{
		preRequest();
		if(realSubject == null)
		{
			realSubject = new RealSubject();
		}
		realSubject.request();
		postRequest();
	}
	private void preRequest()
	{
		System.out.println("前期宣傳活動,免費品嚐");
	}
	private void postRequest()
	{
		System.out.println("結束宣傳活動,付費購買");
	}
}

   執行結果:

前期宣傳活動,免費品嚐
我是紅酒廠商,歡迎品嚐購買!
結束宣傳活動,付費購買

  分析:代理設計模式的核心組成部分:一個介面兩個子類,一個子類負責真實的業務操作功能,如紅酒廠商;一個子類負責完成與真實業務相關的操作,如紅酒代理商。

  程式4:介面與抽象類設計

package com.liaojianya.chapter2;

import java.util.Scanner;

/**
 * 利用介面及抽象類設計實現:
 * 1)定義介面圓形CircleShape,其中定義常量PI,提供方法computeArea()計算面積
 * 2)定義圓形類Circle實現介面CircleShape,包含構造方法和求圓形周長方法;
 * 3)定義圓柱繼承Cicle實現介面CircleShape,包含構造方法,圓柱表面積,體積;
 * 4)從控制檯輸入圓半徑,輸出圓面積及周長;
 * 5)從控制檯輸入圓柱底面半徑及高,輸出圓柱底面積、圓柱表面積及體積。
 * @author LIAO JIANYA
 * 2016年7月27日
 */
public class InterfaceAndAbstract
{
	public static void main(String[] args)
	{
		Scanner san = new Scanner(System.in);
		System.out.println("輸入圓的半徑:");
		double r = san.nextDouble();
		Circle circle = new Circle(r);
		System.out.println("圓的面積為:" + circle.computeArea() 
			+ ",圓的周長為:" + circle.computeGirth());
		System.out.println("輸入圓柱底面半徑:");
		r = san.nextDouble();
		System.out.println("輸入圓柱高:");
		double h = san.nextDouble();
		Cylinder cylinder = new Cylinder(r, h);
		System.out.println("圓柱的底面積為: " + cylinder.computeBaseArea() 
			+ ",圓柱的表面積為:" + cylinder.computeSurfaceArea()
			+ ",圓柱的體積為:" + cylinder.computeVolune());
		san.close();
	}

}

interface CircleShape
{
	public static final double PI = 3.14;
	public double computeArea();
}

class Circle implements CircleShape
{
	double area;
	double girth;
	double r;
	public Circle(double r)
	{
		this.r = r;
	}
	public double computeArea()
	{
		return area = PI * r * r;
		
	}
	
	public double computeGirth()
	{
		return girth = 2 * PI * r;
	}
}

class Cylinder extends Circle implements CircleShape
{
	double baseArea;
	double sufaceArea;
	double volume;
	double h;
	public Cylinder(double r, double h)
	{
		super(r);
		this.h = h;
	}
	
	public double computeBaseArea()
	{
		return baseArea = super.computeArea();
	}
	
	public double computeSurfaceArea()
	{
		return sufaceArea = super.computeGirth() * h;
	}
	
	public double computeVolune()
	{
		return volume = baseArea * h;
	}
}

  執行結果:

輸入圓的半徑:
1
圓的面積為:3.14,圓的周長為:6.28
輸入圓柱底面半徑:
1
輸入圓柱高:
2
圓柱的底面積為: 3.14,圓柱的表面積為:12.56,圓柱的體積為:6.28