程序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
