zoukankan      html  css  js  c++  java
  • 入门设计模式之备忘录模式

    学习更多设计模式请参考:入门设计模式之汇总篇 

    备忘录模式:在不破坏封装的条件下,将一个对象的状态捕捉住,并在外部化存储起来,从而可以在将来合适的时候把这个对象还原到存储时的状态。

    通常的备忘录模式包含3个角色:

    1. 发起人角色:这个角色就是需要被保存状态的角色
    2. 备忘录角色:负责保存发起人角色的状态的对象
    3. 负责人角色:负责保存备忘录对象,且它不能看到备忘录的内容

    我们通过一个简单的例子来描述一下这几个角色:

    我们知道现在有很多小姐姐喜欢自拍,而已有的是很火辣的那种不能为外人道哉的。这些小姐姐通常把这类照片存在手机的私密相册中。

    看一下这句话,能不能看出来备忘录3个角色分别对应的什么呢?

    我知道厉害的你已经懂了,就算不懂也没关系,我们接着往下看:

    1. Client:客户端,负责调用发起人和负责人
    2. Girl:这个就是发起人了,她拍个每一个照片可以都看做是一种状态
    3. Phone:负责人,顾明思议,这个是手机,它负责存储照片
    4. 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,转载请保留。

  • 相关阅读:
    电脑出现的问题以及解决方法
    [2] 立方体(Box)图形的生成算法
    [1] 平面(Plane)图形的生成算法
    [0] 各类图形的数据大小获得
    3D几何图形的生成算法
    3D几何图形生成的DEMO
    花了两天时间为我的引擎实现了性能分析的界面显示
    游戏:贪吃虫(GreedyMaggot)
    相声段子:求爱总动员
    三维体数据分割算法
  • 原文地址:https://www.cnblogs.com/zhixiang-org-cn/p/9265704.html
Copyright © 2011-2022 走看看