設計模式簡析

近期閱讀了《大話設計模式》一書受益良多,特寫此文以作筆記
本文將從如下三個方面開始講述:

  • 面嚮對象語言的三大特性
  • 簡易設計原則
  • 設計模式分析

    面嚮對象語言有三大特性:封裝,繼承,多態


封裝是指將對象所應具有的行爲進行包裝,進而爲對象內部和對象外部的調用提供統一規範的接口。例如:

/**
 *
 * @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);
    }

}

今晚先寫到這裏,以上均是鄙人愚見,如有錯誤,還望各位不吝賜教。

發佈了25 篇原創文章 · 獲贊 0 · 訪問量 2848
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章