學習更多設計模式請參考:入門設計模式之彙總篇 備忘錄模式:在不破壞封裝的條件下,將一個對象的狀態捕捉住,併在外部化存儲起來,從而可以在將來合適的時候把這個對象還原到存儲時的狀態。 通常的備忘錄模式包含3個角色: 發起人角色:這個角色就是需要被保存狀態的角色 備忘錄角色:負責保存發起人角色的狀態的對象 ...
學習更多設計模式請參考:入門設計模式之彙總篇
備忘錄模式:在不破壞封裝的條件下,將一個對象的狀態捕捉住,併在外部化存儲起來,從而可以在將來合適的時候把這個對象還原到存儲時的狀態。
通常的備忘錄模式包含3個角色:
- 發起人角色:這個角色就是需要被保存狀態的角色
- 備忘錄角色:負責保存發起人角色的狀態的對象
- 負責人角色:負責保存備忘錄對象,且它不能看到備忘錄的內容
我們通過一個簡單的例子來描述一下這幾個角色:
我們知道現在有很多小姐姐喜歡自拍,而已有的是很火辣的那種不能為外人道哉的。這些小姐姐通常把這類照片存在手機的私密相冊中。
看一下這句話,能不能看出來備忘錄3個角色分別對應的什麼呢?
我知道厲害的你已經懂了,就算不懂也沒關係,我們接著往下看:
- Client:客戶端,負責調用發起人和負責人
- Girl:這個就是發起人了,她拍個每一個照片可以都看做是一種狀態
- Phone:負責人,顧明思議,這個是手機,它負責存儲照片
- Album:相冊介面
看了類圖你可能會感覺迷糊了,哎你不是說負責人不能看到備忘錄的東西麽,你這裡面負責人可以直接持有了備忘錄對象呀,它看不到啥呀,你這樣搞小姐姐們的照片不就被公開了麽?其實接著再往下看代碼你就明白了
public interface Album {
}
public class Girl {
private String state;
public Album getPrivateAlbum(){
return new PrivateAlbum(this.state);
}
public void restore(Album album){
PrivateAlbum privateAlbum =(PrivateAlbum)album;
this.setState(privateAlbum.getState());
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
private class PrivateAlbum implements Album{
private String state;
private PrivateAlbum(String state){
this.state=state;
}
private String getState() {
return state;
}
private void setState(String state) {
this.state = state;
}
}
}
public class Phone {
private Album album;
public Album reductionAlbum() {
return album;
}
public void saveAlbum(Album album) {
this.album = album;
}
}
public class Client {
private static Girl xiaoWang=new Girl();
private static Phone phone =new Phone();
public static void main(String args[]){
xiaoWang.setState("三點式");
phone.saveAlbum(xiaoWang.getPrivateAlbum());
System.out.println(xiaoWang.getState());
xiaoWang.setState("絲襪制服式");
System.out.println(xiaoWang.getState());
xiaoWang.restore(phone.reductionAlbum());
System.out.println(xiaoWang.getState());
}
}
告訴我你看到了什麼?相冊介面僅僅作為標示介面存在的,它的實現是Girl裡面的一個私有內部類PrivateAlbum 類,這個類啊,是一個加密相冊,在其餘任何地方都是看不到的,只有小姐姐自己可以看見,妥妥的安全。
現在,你get到備忘錄模式了麽?
本文出自https://zhixiang.org.cn/#/blog/read/c4596b50-e2e2-4414-ad58-65c72e02cd1b,轉載請保留。