Mình ăn nói không tốt lắm, chỉ cố gắng giải thích hết sức để bạn hiểu thôi.
PHP:
// Giao tiếp Animal
public interface Animal {
public void setAlias();
public String move();
public int avgWeight();
public int avgAge();
}
// Lớp Human
public class Human implements Animal{
private String alias;
public Human() {
}
public void setAlias(String a) {
this.alias = a;
}
public String move() {
return "Walk";
}
public int avgWeight() {
return 50;
}
public int avgAge() {
return 60;
}
}
// Lớp Cat
public class Cat implements Animal{
private String alias;
public Cat() {
}
public void setAlias(String a) {
this.alias = a;
}
public String move() {
return "Walk";
}
public int avgWeight() {
return 3;
}
public int avgAge() {
return 5;
}
}
// Lớp Bird
public class Bird implements Animal{
private String alias;
public Bird() {
}
public void setAlias(String a) {
this.alias = a;
}
public String move() {
return "Fly";
}
public int avgWeight() {
return 10;
}
public int avgAge() {
return 15;
}
}
// Lớp AnimalUtil
public class AnimalUtil {
public static int HUMAN = 1 << 0 // 1
public static int CAT = 1 << 1 // 2
public static int BIRD = 1 << 2 // 4
public static Animal getAnimal(int what) {
switch(what) {
case: this.HUMAN;
return new Human();
case: this.CAT;
return new Cat();
case: this.BIRD;
return new Bird();
default: // Tham số không hợp lệ
return null; // Hoặc quăng ngoại lệ.
}
}
}
// Lớp Tesing
public class Tesing {
public static void main(String[] args) {
try {
Animal an = null;
// Human
System.out.println("Animal: Human");
an = AnimalUtil.getAnimal(AnimalUtil.HUMAN);
an.setAlias("I'm Human!");
System.out.println("Move: " + an.move());
System.out.println("Average weight: " + an.avgWeight());
System.out.println("Average age: " + an.avgAge());
// Cat
System.out.println("Animal: Cat");
an = AnimalUtil.getAnimal(AnimalUtil.CAT);
an.setAlias("A Cat!");
System.out.println("Move: " + an.move());
System.out.println("Average weight: " + an.avgWeight());
System.out.println("Average age: " + an.avgAge());
// Bird
System.out.println("Animal: Bird");
an = AnimalUtil.getAnimal(AnimalUtil.BIRD);
an.setAlias("Fly! Fly! Fly!");
System.out.println("Move: " + an.move());
System.out.println("Average weight: " + an.avgWeight());
System.out.println("Average age: " + an.avgAge());
} catch (Exception e) {
// Phòng trường hợp có ngoại lệ
}
}
}
Kết quả:
Code:
Animal: Human
Move: Walk
Average weight: 50
Average age: 60
Animal: Cat
Move: Walk
Average weight: 3
Average age: 5
Animal: Bird
Move: Fly
Average weight: 10
Average age: 15
Mấy thông số phía trên không phải là chính xác đâu nhé
Vai trò của các lớp và giao tiếp của mình tương đương với đoạn mã phía trên của bạn:
Animal tương ứng với
HttpConnection Lớp giao tiếp
AnimalUtil tương ứng với
Connector Lớp dùng để tạo ra thực thể của lớp giao tiếp, tức là lớp con của lớp giao tiếp trên.
getAnimal(int) tương ứng với
open(String) Phương thức để tạo ra thực thể của lớp gia tiếp
setAlias(String) tương ứng với
setRequestMethod(int)
Thực ra
open(String) trả về một đối tượng (thực thể) con của lớp
HttpConnection, chính vì thế mà lớp này có thể dùng phương thức đó, vì lớp con của nó đã cài lại phương thức
setRequestMethod(int) và
getLength()
Nếu bạn có thể xem mã nguồn của phương thức open(String) thì bạn sẽ thấy nó tạo ra thực thể lớp con của HttpConnection.
Giống như phương thức
getAnimal(int) nó trả về kiểu
Animal, thực sự thì nó trả về
Human,
Cat hoặc
Bird là các lớp con của
Animal, mà các lớp con này các phương thức đã được cài rồi.
Lúc mới học mình tự hỏi: "thằng điên nào tạo ra cái giao tiếp làm gì cơ chứ, nó chẳng tạo được thực thể, mỗi lần gọi nó thì phải cài lại các phương thức của nó, rắc rối!"
Đến khi mình làm nhiều thì mới biết, nó thực sự quan trọng, nếu không có nó, có thể mất đi nhiều thứ ở lập trình hướng đối tượng. Nó giống như là một tiêu chuẩn định sẵn.
Như kiểu: Mỗi làng (
giao tiếp) phải có một cái cổng, một cái giếng, và một cái đình, Tết phải tổ chức lễ hội vui chơi... (
thuộc tính hoặc phương thức). Nói thế tức là không phải làng (
lớp) nào cũng phải là hình dáng, tổ chức,... mấy thứ đó giống nhau. Mỗi làng có cách xây cất, vui chơi (
cài đặt) riêng.
Có một điều nhỏ là phương thức open(String) không trả về trực tiếp kiểu HttpConnection thì phải, vì thấy bạn ép kiểu, có thể nó trả về một giao tiếp cha của HttpConnection.