在备忘录模式中,需要设计一个宽接口(对某个某个特殊对象SpecialObject提供的接口),而窄接口对所有对象(OtherObject)提供的接口。怎样才能满足这样的需求呢?这种情况应该把宽接口设计成SpecialObject的内部类,但是有个问题就是这个类的接口方法不能被其他对象调用,需要做的就是把这个内部类的所有方法设置为private,那么怎样暴露一个窄接口给外部呢? 有个最窄的接口就是标记接口(类似Cloneable接口)只起一个标记左右,里面没有任何方法的申明。可以让这个内部实现标记接口,然后通过这个接口发布出去。这样就实现了这个需求。下面用双接口模式实现备忘录模式
备忘录模式:
备忘录模式的结构
- 发起人:记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据。
- 备忘录:负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。
- 管理角色:对备忘录进行管理,保存和提供备忘录。
- 我们只希望对发起人提供宽接口,而不希望对管理角色提供宽接口,管理角色不应该有权限改变备忘录,它只负责存储备忘录。因此需要给管理角色提供一个窄接口的备忘录。 代码实现
-
package com.memo.pattern; /** * 一个标记接口 * @author luochao * */ public interface NarrowInterface { }
-
package com.memo.pattern; import java.io.Closeable; public class SpecialObject { //发起人状态 private String state; public SpecialObject(){ } public NarrowInterface createNarrow(){ return new Memo(this.state); } public void RestoreState(NarrowInterface memo){ Memo memoto = (Memo)memo; this.setState(memoto.getSaveState()); } //备忘录对象 class Memo implements NarrowInterface{ private String saveState; //private construct method private Memo(String saveState) { this.saveState = saveState; } public String getSaveState() { return saveState; } public void setSaveState(String saveState) { this.saveState = saveState; } } public String getState() { return state; } public void setState(String state) { this.state = state; } }
package com.memo.pattern; public class Other { private NarrowInterface memo; public NarrowInterface getMemo() { return memo; } public void saveMemo(NarrowInterface memo) { this.memo = memo; } }
package com.memo.pattern; public class Client { private static SpecialObject o = new SpecialObject(); private static Other other = new Other(); public static void main(String[] args) { o.setState("off"); //管理者保存备忘录对象 other.saveMemo(o.createNarrow()); o.setState("on"); //从管理者对象中取出之前存档的备忘录用来恢复状态 o.RestoreState(other.getMemo()); } }
相关推荐
在JDK1.0时代,本地接口(Native Interface)的设计较为初级,主要面向C语言结构,这使得Java在跨平台移植时遇到了挑战。原生的Java类型与本地数据类型的映射并不直观,导致了Java与本地代码交互时的复杂性。此外,...
7. **浮点类型限制**:Java中的浮点类型包括`float`和`double`,声明`float f=5.2`是错误的,因为5.2是一个双精度浮点数,需要强制类型转换才能赋值给`float`。 8. **变量交换**:在Java中,交换两个变量的值通常...
Java中双检锁/双重检查锁定(Double-Check Locking,DCL)和静态内部类是实现线程安全单例的常用方法。 5. 状态对象模式:用于在多线程中同步访问对象的状态,例如CountDownLatch、CyclicBarrier和Semaphore等并发...
### JAVA程序设计习题库及答案(非常全面) #### 第一章 Java语言概论 **一、选择题解析** 1. **题目:** 下列不属于java语言鲁棒性特点的是: - A. java能检查程序在变异和运行时的错误 - B. java能运行虚拟机...
- **Socket**:Java中的网络编程接口,用于建立客户端和服务器间的连接。 - **Eclipse**:强大的Java开发环境,提供便捷的代码编写和调试功能。 - **TCP/IP**:网络通信的基础协议,保证数据的可靠传输。 这个课程...
本文将深入探讨在Java课程设计中涉及的一些核心概念,特别是与继承、数组、异常处理和图形用户界面(GUI)相关的知识点。 首先,我们关注的是继承。在Java中,继承允许一个类(子类或派生类)从另一个类(超类或...
3. **并发设计模式**:书里可能讨论了如何使用各种并发设计模式来解决并发问题,比如生产者消费者模型、双检锁(DCL)、读写锁(ReentrantReadWriteLock)等。 4. **并发工具类**:Java并发包(java.util....
Thread类和Runnable接口是Java中实现多线程的基础,而ExecutorService和Future接口提供了更高级别的线程管理功能。 4. **I/O流**:Java的I/O流系统对于网络数据的读写至关重要。InputStream和OutputStream是处理...
【JAVA模拟QQ在线聊天源码下载毕业设计】这个项目是一个基于Java编程语言实现的QQ聊天应用的模拟系统,主要用于帮助学生进行毕业设计实践。在这个项目中,你可以学习到如何运用Java技术来构建一个实时的、多用户交互...
【JAVA聊天程序设计】 在Java编程领域,设计聊天程序是一项常见的练习,旨在加深对网络通信、多线程、GUI设计等技术的理解。本程序利用Java的特性,构建了一个简单的聊天应用,涵盖了网络通信基础、图形用户界面...
Java网络程序设计是一门深入探讨如何使用Java语言开发网络应用程序的学科。这门技术涵盖了从基本的TCP/IP通信到高级的Web服务和分布式系统。在Java中,网络编程主要依赖于Java的Socket API和其他相关类库,这些工具...
《Java语言程序设计-进阶篇》是Java编程领域的一本经典教材,其原书第10版提供了中英文双语版本,对于学习者来说,无论是深入理解Java语言的精髓,还是提升跨文化交流能力,都是不可多得的资源。本教材主要针对已经...
Java聊天室毕业设计是一个典型的项目案例,用于展示Java编程在实时通信系统中的应用。这个项目不仅涵盖了编程语言的基础,还涉及到了网络编程、多线程、数据库交互等多个关键知识点。以下将详细介绍这些方面: 1. *...
这些方法遵循了Java中的封装原则,即隐藏数据的内部实现并提供公共接口来访问这些数据。 接着是`Employee`类,它表示员工。`Employee`类包含三个私有成员变量:`name`、`salary`和`hireDay`,分别代表员工姓名、...
Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决常见问题的模板或最佳实践。这些模式在Java编程中被广泛运用,能够提高代码的可读性、可维护性和可扩展性。以下是关于标题和描述中提到的Java常用设计...
3. **并发设计模式**:书中详细介绍了各种并发设计模式,如生产者消费者模型(BlockingQueue)、读写锁模式(ReadWriteLock)、双检查锁定模式(Double-Checked Locking)、线程池模式(ThreadPoolExecutor)等,...
在Java程序设计与数据结构的学习过程中,第九章通常会涵盖数据结构的重要概念和应用,包括数组、链表、栈、队列、树等基础数据结构,以及如何利用这些数据结构来解决问题。本资源提供了第九章的习题答案,旨在帮助...
Java语言程序设计教程是针对初学者的一套详细教学资源,旨在帮助他们掌握Java编程的基础知识和进阶技能。Java作为一种广泛应用于互联网、企业级应用、移动开发等领域的面向对象编程语言,具有平台无关性、安全性和...