初衷:
最近一直在研究設計模式,主要以專研《Head First設計模式》以及看網上各路大神的見解,這邊想用自己對于23種設計模式的理解,用一種非程式員都能理解的方式去介紹設計模式,畢竟我覺得設計模式是一種很好的處理問題的思想方法,不應該僅限于代碼的實作,希望能夠對于剛接觸設計模式的小伙伴們有所幫助,當然有不對的地方,歡迎下方留言,一定及時修改,
觀察者模式實作:
讓我們一起動動腦瓜子,逐步解決如下問題吧!
-
首先,我們先假設我們有三個不同型別的女朋友,
第一位:可愛小妹妹,喜歡用QQ跟你聊天,
第二位:同歲青梅竹馬,喜歡用微信跟你聊天,
第三位:御姐上司,喜歡用釘釘跟你聊天,

-
然后,每天晚上呢,我們都會跟女朋友說晚安,并讓她們早點休息,一開始我們還是能夠應付的,不過慢慢的我們發現,不停地切換三個軟體去聊天實在是麻煩,于是,我們就想了一個辦法,
我們跟每個女朋友說,以后我們聊天都直接打電話吧,你們把電話號碼給我,不然我們就分手!!!女朋友都覺得我們很好,不舍得分手就同意了我們的安排,(如果不同意,那就真分手了,不聯系了哦!) -
現在我們跟女朋友們都開始電話聯系了,這里的實作有幾個必要的條件:
第一:女生有手機,有手機號碼,
第二:你有手機號碼本,并且女朋友們把她們的手機號碼告訴了你,
第三:女生承認是你的女朋友,愿意接你電話,
只有滿足以上三者條件,我們才能方便的用打電話的方式,方便的聯系每一個女朋友,

-
有了上面的條件,我們發現談戀愛對我們來說,很是輕松啊,簡簡單單就應付了三個女朋友,這時新的目標出現了,我們發現住我們隔壁的鄰居小妹很漂亮,并且偶爾一起上下樓,日久生情嘛,有一天小妹主動問我們,能不能跟我們處情侶關系,當然我們不是隨便的人,我們可是有條件的,只有小妹能夠接受三個要求,才能做我們女朋友,
三個條件跟對待其他女朋友一樣:
第一:女生有手機,有手機號碼,
第二:你有手機號碼本,并且女朋友們把她們的手機號碼告訴了你,
第三:女生承認是你的女朋友,愿意接你電話,
就這樣我們的女朋友又多了一個,當然只要有緣分,女生只要愿意接受上面的條件,都能做我們女朋友,多多益善,

-
當然了隨著女朋友越來越多,總有我們應付不過來的時候,兩個人的感情就出現了問題,你決定跟某些女生分手不再聯系,這時你從自己的號碼本上刪掉了某些女生的聯系方式,也不會再去打電話給她們,
初步總結
看完上面的例子,獲取大家還有點小蒙,這戀愛之術跟我們大觀察者設計模式有什么關系,別著急這就跟大伙解釋,
首先,簡單描述觀察者模式:觀察者模式定義的是物件之間一對多的依賴,當一個物件狀態改變時,會通知所有的依賴者,
那么,在上述案例中,我們這個角色,就可以等價于觀察者模式里的物件,也就是被觀察者,我們的眾多女朋友可以等價于觀察者或依賴者,當我們有事的時候,都會通過統一的方式去通知所有的女朋友,在目前我的理解中,通知方式的統一是觀察者模式的核心,后期有更深理解時,再回來修改,有什么高深間接歡迎下方留言,
=接下來是程式猿時間=
接下來讓我們用代碼實作并詳細了解一下觀察者模式,
讓我們回到最開始的階段,
1、有三個女朋友,用三種方式跟我們聯系,
新建三個類,代表女朋友:
public class GirFriend01 {
public void QQ(String thing){
System.out.println("我是一號,我現在去"+thing);
}
}
public class GirFriend02 {
public void WeChat(String thing){
System.out.println("我是二號,我現在去"+thing);
}
}
public class GirFriend03 {
public void DingDing(String thing){
System.out.println("我是三號,我現在去"+thing);
}
}
2、然后新建一個類,代表我們,我們可以讓女朋友們去做相同的事情,君子有言:我對每個女朋友的愛都是全心全意的,沒有差別,對吧!
public class Me {
GirFriend01 girFriend01 = new GirFriend01();
GirFriend02 girFriend02 = new GirFriend02();
GirFriend03 girFriend03 = new GirFriend03();
public void tellGirlsToDo(String thing){
girFriend01.QQ(thing);
girFriend02.WeChat(thing);
girFriend03.DingDing(thing);
}
}
3、寫個簡單的測驗類,測驗一下我們的代碼:
public classTest {
public static void main(String[] args) {
Me me = new Me();
me.tellGirlsToDo("睡覺,晚安");
}
}
運行結果:
我是一號,我現在去睡覺,晚安
我是二號,我現在去睡覺,晚安
我是三號,我現在去睡覺,晚安
女朋友們都聽到我們的問候,乖乖睡覺去了,沒有問題,
4、但是從上訴代碼中我們可以明細感覺到很多代碼可以簡化,(如果你有看我關于設計模式系列的第一篇策略模式的話,應該能這么認為,常人能看懂的設計模式(一)策略模式)
可封裝的部分主要有兩塊:
第一點:我們應該有一個物件集合統一管理我們的女朋友,這樣不管是新的女朋友的增加還是感情分裂的女朋友的洗掉都會更加方便,
第二點:跟每個女朋友的聯系方式應該用同一種,不然太麻煩了,
根據上訴兩點,我們對代碼進行第一次優化:
a、作為我們的女朋友,要用我們定好的約定跟我們聯系,也就是例子中的打電話,根據策略模式的基礎,當我們創建特定類的時候目前有兩種方式:一、繼承一個父類,二、實作某個介面,我們更應該是秉承“有一個”比“是一個”好的方式,去實作一個介面,這里的話,當然是讓女朋友們都實作打電話的介面,
定義打電話介面:
public interface Phone {
void phone();
}
更新女朋友的類
public class GirFriend01 implements Phone{
public void QQ(String thing){
System.out.println("我是一號,我現在去"+thing);
}
@Override
public void phone(String thing) {
System.out.println("我是一號,我現在去"+thing);
}
}
public class GirFriend02 implements Phone{
public void WeChat(String thing){
System.out.println("我是二號,我現在去"+thing);
}
@Override
public void phone(String thing) {
System.out.println("我是二號,我現在去"+thing);
}
}
public class GirFriend03 implements Phone{
public void DingDing(String thing){
System.out.println("我是三號,我現在去"+thing);
}
@Override
public void phone(String thing) {
System.out.println("我是三號,我現在去"+thing);
}
}
b、更新我們的類,用一個物件集合來管理我們的女朋友們,能夠增加和洗掉女朋友,
public class Me {
private List<Phone> grils = new ArrayList<>();
public void addGirls(Phone phone){
grils.add(phone);
};
public void delGirls(Phone phone){
grils.remove(phone);
}
public void tellGirlsToDo(String thing){
for(Phone phone:grils){
phone.phone(thing);
}
}
}
這塊聰明的同志們肯定能想到,Me作為一個特定的類,我們應該也能對齊進行優化,
定義一個GetGirls介面,里面包含了我們Me里面實作的幾個方法,這樣我們就能創建不同的Me了,
定義GetGirls介面:
public interface GetGirls {
void addGirls(Phone phone);
void delGirls(Phone phone);
void tellGirlsToDo(String thing);
}
Me類實作GetGirls介面:
public class Me implements GetGirls{
private List<Phone> grils = new ArrayList<>();
public void addGirls(Phone phone){
grils.add(phone);
};
public void delGirls(Phone phone){
grils.remove(phone);
}
public void tellGirlsToDo(String thing){
for(Phone phone:grils){
phone.phone(thing);
}
}
}
5、撰寫測驗類查看測驗結果
public class Test {
public static void main(String[] args) {
Me me = new Me();
me.addGirls(new GirFriend01());
me.addGirls(new GirFriend02());
me.addGirls(new GirFriend03());
me.tellGirlsToDo("睡覺,晚安!");
}
}
測驗結果:
我是一號,我現在去睡覺,晚安!
我是二號,我現在去睡覺,晚安!
我是三號,我現在去睡覺,晚安!
Java內置的觀察者模式
到此為止其實,我們已經從無到有完成了觀察者模式, 東西應該不是很難理解,主要還是把該封裝的簡化的地方進行了改善,當然,這邊Java API有內置的觀察者模式,java.util包中,包含有最基本的Observer介面與Observable類,這與我們上面例子里寫的
GetGirls介面和Phone介面差不多,只是Observer介面與Observable類使用上更為方便,
很多功能前輩已經幫我們寫好了,甚至我門可以用push和pull的方式來傳遞訊息,
讓我們用Observer介面與Observable類來實作我們的例子,
1、修改我們Phone介面名字為Observer,方法名改為update,其他不變,
public interface Observer {
void update(String thing);
}
2、修改我們的女朋友們,其實沒什么改變就換下方法名
public class GirFriend01 implements Observer {
public void QQ(String thing){
System.out.println("我是一號,我現在去"+thing);
}
@Override
public void update(String thing) {
System.out.println("我是一號,我現在去"+thing);
}
}
public class GirFriend02 implements Observer {
public void WeChat(String thing){
System.out.println("我是二號,我現在去"+thing);
}
@Override
public void update(String thing) {
System.out.println("我是二號,我現在去"+thing);
}
}
public class GirFriend03 implements Observer {
public void DingDing(String thing){
System.out.println("我是三號,我現在去"+thing);
}
@Override
public void update(String thing) {
System.out.println("我是三號,我現在去"+thing);
}
}
3、現在我們要開始修改我們的Me類了,這塊改動比較大,主要變化有下面幾點:
a、Observable類是一個類,不是介面,我們是用繼承的方式來創建Me類的,
b、多了一個setChange()方法,標記已經變化的事實,
c、去除了增加女朋友和洗掉女朋友以及聯系女朋友的方法,已經從超類繼承了這些行為,
,,,
兄弟們寫不動了,關于官方的觀察者模式具體使用可以參考其他文章,我這邊就帶大家理解理解,剩下的,我后面有時間補上吧,碼字真的比敲代碼還累,

歡迎一鍵三連哈,,,,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/282879.html
標籤:其他
上一篇:c語言入門學習(一)
