近期閱讀了《大話設計模式》一書受益良多,特寫此文以作筆記
本文將從如下三個方面開始講述:
- 面嚮對象語言的三大特性
- 簡易設計原則
設計模式分析
面嚮對象語言有三大特性:封裝,繼承,多態
封裝是指將對象所應具有的行爲進行包裝,進而爲對象內部和對象外部的調用提供統一規範的接口。例如:
/**
*
* @author yanjy
* @date 2017/10/16
*/
public class Dog {
private String name;
private int shoutTime = 6;
public Dog(String name, int shoutTimes) {
this.name = name;
this.shoutTime = shoutTimes;
}
public void shout() {
for (int i = 0; i < shoutTime; i++) {
System.out.println(name + ": 汪汪汪");
}
}
public static void main(String[] args) {
Dog dog = new Dog("小黑", 3);
dog.shout();
}
}
繼承是一種is-a的關係,有兩個對象A,B,如果可以描述爲B是A,那麼B可以繼承A。例如:狗是哺乳動物。繼承的特點是繼承者擁有被繼承的特性,同時還兼備自己獨有的個性,在需要的時候還可以覆寫被繼承者特性的內部實現。可以說繼承者是被繼承的一個特例化。例如:
/**
*
* @author yanjy
* @date 2017/10/16
*/
public class Animal {
protected String name;
protected int shoutTimes;
}
/**
*
* @author yanjy
* @date 2017/10/16
*/
public class Dog extends Animal{
public Dog(String name, int shoutTimes) {
super.name = name;
super.shoutTimes = shoutTimes;
}
public void shout() {
for (int i = 0; i < shoutTimes; i++) {
System.out.println(name + ": 汪汪汪");
}
}
public static void main(String[] args) {
Dog dog = new Dog("小黑", 3);
dog.shout();
}
}
注:繼承可以是子類之間進行代碼共享,但向子類暴露了部分實現細節,加大了父子類之間的耦合度。建議當明確兩個對象間是is-a關係再去使用。
多態是指不同的對象可以具有相同的行爲,且要通過自己實現的代碼來執行。多態的原理是當方法被調用時,無論對象是否轉化成父類,都只有位於繼承鏈最末端的方法實現會被調用。引用一句Brucee Eckel的話:“不要犯傻,如果它不是晚綁定,它就不是多態。”例如:重載就是靜態綁定,在編譯期間就已經確定了。
/**
*
* @author yanjy
* @date 2017/10/16
*/
public class Dog extends Animal{
public Dog(String name, int shoutTimes) {
super.name = name;
super.shoutTimes = shoutTimes;
}
@Override
public void shout() {
for (int i = 0; i < shoutTimes; i++) {
System.out.println(name + ": 汪汪汪");
}
}
public static void main(String[] args) {
Dog dog = new Dog("小黑", 3);
dog.shout();
}
}
/**
*
* @author yanjy
* @date 2017/10/16
*/
public class Cat extends Animal{
public Cat(String name, int shoutTimes) {
super.name = name;
super.shoutTimes = shoutTimes;
}
@Override
public void shout() {
for(int i = 0; i < shoutTimes; i++) {
System.out.println(name + ":喵喵喵");
}
}
}
import java.util.LinkedList;
import java.util.List;
/**
*
* @author yanjy
* @date 2017/10/16
*/
public class Client {
public static void main(String[] args) {
List<Animal> animals = new LinkedList<>();
animals.add(new Cat("喵喵", 3));
animals.add(new Dog("汪汪", 3));
animals.forEach(Animal::shout);
}
}
今晚先寫到這裏,以上均是鄙人愚見,如有錯誤,還望各位不吝賜教。