`
dreamstone
  • 浏览: 288413 次
  • 来自: ...
文章分类
社区版块
存档分类

Java中的模式 --- 双重接口的实现,备忘录模式

阅读更多
一、定义:备忘录(memento)模式又叫快照(snapshot)模式或者token模式,主要功能:
备忘录模式是用一个对象来存储另外一个对象的内部状态的快照,实现备忘录模式的关键点是在不破坏封装的
情况下,将一个对象的状态捕捉住,并外部化,存储起来,从而可以在合适的时候,把这个对象还原。
说明:备忘录模式适模式中比较好理解的一个,这里就不举例子,但是备忘录模式是模式中实现比较难,或者说
实现比较巧的,这里主要说说。
二、备忘录模式的实现
1,备忘录模式中的角色
发起人:创建含有内部状态的备忘录对象,并使用备忘录对象存储状态
负责人:负责人保存备忘录对象,但不检查备忘录对象的内容
备忘录:备忘录对象将发起人对象的内部状态存起来,并保正其内容不被发起人对象之外的对象像读取
注意:在备忘录的角色中,定义了他必须对不同的人提供不同的接口,对发起人提供宽接口,对其它任何人提供窄
接口。也许你说我都提供宽接口得了。对这也是备忘录的一种实现,叫做白箱备忘录,不过这种方法的封装没有设计
好,安全性不够好。
2,白箱备忘录的实现:
 1public class Originator{
 2    private String state;
 3    public Memento CreateMemento(){
 4        return new Memento(state);
 5    }

 6    public void restoreMemento(Memento memento){
 7        this.state = memento.getState();
 8    }

 9    public String getState(){
10        return this.state;
11    }

12    public void setState(String state){
13        this.state=state;
14        System.out.println("Current state = " + this.state);
15    }

16}

17public class Memento{
18    private String state;
19    public Memento(String state){
20        this.state = state;
21    }

22    public String getState(){
23        return this.state;
24    }

25    public void setState(){
26        this.state = state;
27    }

28}

29public class Caretaker{
30    private Memento memento;
31    public Memento retrieveMemento(){
32        return this.memento;
33    }

34    public void saveMemento(Memento memento){
35        this.memento = memento;
36    }

37}

38public class Client{
39    private static Originator o = new Originator();
40    private static Caretaker c = new Caretaker();
41    public static void main(Sting[] args){
42        o.setState("ON");
43        c.saveMemento(o.createMemento());
44        o.setState("OFF");
45        o.restoreMemento(c.retrieveMemento());
46    }

47}
白箱的优点:实现简单
白箱的缺点:上边说了,破坏了封装,安全性有些问题。
说明:这里白箱的实现只保存了一个状态,其实是可以保存多个状态的。
3,双接口的实现,宽窄接口(黑箱)
如何实现宽窄接口呢,内部类也许是个好方法。我们把备忘录类设计"成发起人"的内部类,但这样还有的问题是同一
package中的其它类也能访问到,为了解决这个问题,我们可以把"备忘录"的方法设计成私有的方法,这样就
可以保正封装,又保正发起人能访问到。实现如下:
定义窄接口.
 1public interface NarrowMemento{
 2    public void narrowMethod();
 3}

 4class Originator {
 5    private String state;
 6    private NarrowMemento memento;
 7    public Originator(){
 8    }

 9    public NarrowMemento createMemento(){
10        memento = new Memento(this.state);
11        return memento;
12    }

13    public void restoreMemento(NarrowMemento memento){
14        Memento aMemento = (Memento)memento;
15        this.setState(aMemento.getState());
16    }

17    public String getState(){
18        return this.state;
19    }

20    public void setState(String state){
21        this.state = state;
22    }

23    //内部类
24    protected class Memento implements NarrowMemento{
25        private String savedState;
26        private Memento(String someState){
27            saveState = someState;
28        }

29        private void setState(String someState){
30            saveState = someState;
31        }

32        private String getState(){
33            return saveState;
34        }

35        public void narrowMethod(){
36            System.out.println("this is narrow method");
37        }

38        
39    }

40    public NarrowMemento getNarrowMemento(){
41        return memento;
42    }

43}

44public class Caretaker{
45    private NarrowMemento memento;
46    public NarrowMemento retrieveMemento(){
47        return this.memento;
48    }

49    public void saveMemento(NarrowMemento memento){
50        this.memento = memento;
51    }

52}

53public class Client{
54    private static Originator o = new Originator();
55    private static Caretaker c = new Caretaker();
56    public static void main(String[] args){
57        //use wide interface
58        o.setState("On");
59        c.saveMemento(o.createMemento());
60        o.setState("Off");
61        o.restoreMemento(c.retrieveMemento());
62        //use narrow interface
63        NarrowMemento memento = o.getNarrowMemento();
64        memento.narrowMethod();
65        
66    }

67}
ok,实现了对大多数人实现比较窄的接口,对Originator实现了宽接口.
三,最后的一些说明:
1,
分享到:
评论

相关推荐

    java的设计模式 《设计模式-java语言中的应用.pdf》

    Java中的序列化机制可以实现备忘录模式。 以上就是Java设计模式的一些基本概念和应用,理解并熟练掌握这些模式对于编写高质量、易于维护的Java代码至关重要。通过阅读《设计模式——Java语言中的应用》这本书,你...

    java模式-java中的所有模式-java进阶必备···

    备忘录模式(Memento)** - **定义**:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 - **应用场景**:需要在对象之间传递一些额外...

    23三种设计模式java实现

    - **备忘录模式**:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后恢复对象的先前状态。Java中,通过实现序列化或使用第三方库如Google的Gson来实现。 - **解释器模式**...

    java23中设计模式详解

    18. **备忘录模式**:在不破坏封装性的前提下,捕获一个对象的状态以便在需要时能够恢复。 19. **观察者模式**:定义对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并...

    23种设计模式的Java实现

    18. **备忘录模式(Memento)**:在不破坏封装性的前提下,捕获一个对象的状态并在需要时恢复。Java中,备忘录对象存储原始对象的状态,可以通过序列化或自定义数据结构实现。 19. **观察者模式(Observer)**:...

    Java的23种设计模式百度云下载链接.rar

    18. **备忘录模式**:在不破坏封装性的前提下,捕获一个对象的状态,以便以后恢复。Java中的`Serializable`接口可以实现对象的序列化,实现数据备份和恢复。 19. **状态模式**:允许对象在其内部状态改变时改变它的...

    23种设计模式的java源代码实现.rar

    在Java中,备忘录模式通常使用私有内部类来存储对象状态,保护原始对象的封装性。 以上只是23种设计模式中的一部分,每种模式都有其特定的应用场景和优缺点。了解并熟练应用这些设计模式,能够帮助开发者编写出更加...

    java与模式(含源码)

    15. 备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后恢复对象的这个状态。 16. 状态模式:允许一个对象在其内部状态改变时改变它的行为。`java.net.Socket`类...

    设计模式java 版本

    22. **备忘录模式**:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将对象恢复到原先保存的状态。Java中,可以使用序列化或自定义方法来实现。 23. **中介者模式**:...

    java设计模式PPT

    如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、迭代器模式(Iterator)、访问者模式(Visitor)、责任链模式(Chain of Responsibility)、命令模式(Command)、备忘录模式...

    23种设计模式的java实现

    13. 备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。Java中可以通过序列化和反序列化实现备忘录。 14. 观察者模式:定义对象之间的一对多依赖关系,当一个对象的状态...

    Java设计模式 图解 附代码

    ##### 1.3.6 备忘录模式 - **定义**:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 - **适用性**: - 当需要保存和恢复数据时。 - 当需要记录对象的状态以便回滚时。 - **参与...

    java设计模式代码实现

    19. **备忘录模式**:在不破坏封装性的前提下,捕获一个对象的状态并在需要时能够恢复。 20. **观察者模式**:定义对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被...

    java设计模式源码

    18. **备忘录模式(Memento)**:在不破坏封装性的前提下,捕获一个对象的状态并在需要时恢复它。Java中,备忘录类存储原始对象的状态,原始对象可以恢复状态。 19. **观察者模式(Observer)**:当对象的状态改变...

    JAVA设计模式整理(有部分参考代码)

    16. **备忘录模式**:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后恢复对象的状态。 17. **解释器模式**:给定一个语言,构建一个解析器来执行该语言中的句子。 18. **...

    设计模式Java版

    16. **备忘录模式**:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后恢复对象的先前状态。 17. **访问者模式**:表示一个作用于某对象结构中的各元素的操作。它使你可以在...

    Java23中设计模式

    Memento(备忘录模式)** - **定义**:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 - **应用场景**:恢复操作、版本控制等。 - **实现方式**:通过外部类管理内部状态的备份。 ...

    23-kinds-of-JAVA-design-patterns.zip_site:www.pudn.com

    19. **备忘录模式**:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态。 20. **状态模式**:允许对象在其内部状态改变时改变其行为,对象...

    23种模式详解-java附详细文档

    19. **备忘录模式**:在不破坏封装性的前提下,捕获一个对象的状态,以便之后恢复。Java中没有内置的备忘录实现,但可以通过序列化或自定义实现。 20. **观察者模式**:当对象状态改变时,通知所有依赖它的对象。...

Global site tag (gtag.js) - Google Analytics