介面(工廠模式&代理模式)
阿新 • • 發佈:2019-01-26
程式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