设计模式(六):初识设计模式

125 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

上一篇文章介绍了设计模式的行为型模式中的部分模式,感兴趣的同学请移步设计模式(五):初识设计模式

行为型模式

备忘录模式(Memento Pattern)

备忘录模式能在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以将该对象恢复到原先保存的状态。在软件层面,备忘录对象主要用来记录一个对象的某种状态或者某些数据,当要做回退的时候,可以从备忘录对象里获取原来的数据进行恢复操作。

备忘录模式的角色及职责

originator:对象(需要保存状态的对象)

Memento:备忘录对象,负责保存好记录

Caretaker:守护者对象,负责保存多个备忘录对象

代码演示:

//目标类
public class Originator{
    private String state;

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }
    public Memento saveStateMemento(){
        return new Memento(state);
    }
    public void getStateFromMemento(Memento memento){
        state = memento.getState();
    }
}

//备忘录对象
public class Memento{
    private String state;

    public Memento(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }
}

//守护者对象
public class Caretaker{
    private List<Memento> mementoList = new ArrayList<Memento>();

    public void add(Memento memento){
        mementoList.add(memento);
    }
    public Memento get(int index){
        return mementoList.get(index);
    }
}

优点给用户提供了一种可以恢复状态的机制,实现了信息的封装,使用户不需要关心状态的保存细节。

缺点类的成员变量过多,会占据较大的资源,保存也会消耗一定的内存。

观察者模式(Observer Pattern)

观察者模式是对象之间多对一依赖的一种设计方案。

状态模式(State Pattern)

状态模式主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题。状态和行为是一一对应的,状态之间可以相互转换。当一个对象的内在状态改变时,允许改变其行为。

优点方便维护,符合开闭原则。

缺点状态过多容易产生很多类,提升维护难度。

策略模式(Strategy Pattern)

策略模式让算法的变化独立于使用算法的客户端。

代码演示:

//接口
public interface Strategy {
    public int doOperation(int num1, int num2);
}

//实体类
public class OperationAdd implements Strategy{
    @Override
    public int doOperation(int num1, int num2) {
        return num1 + num2;
    }
}

public class OperationSubtract implements Strategy{
    @Override
    public int doOperation(int num1, int num2) {
        return num1 - num2;
    }
}

public class Context {
    private Strategy strategy;

    public Context(Strategy strategy){
        this.strategy = strategy;
    }

    public int executeStrategy(int num1, int num2){
        return strategy.doOperation(num1, num2);
    }
}

优点符合开闭原则,易扩展。

缺点策略过多导致类增多。

模板模式(Template Pattern)

模板模式在一个抽象类公开定义了执行它的方法的模板,它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方法执行。它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤。

代码演示:

public abstract class Game {
    abstract void initialize();
    abstract void startPlay();
    abstract void endPlay();

    //模板
    public final void play(){

        //初始化游戏
        initialize();

        //开始游戏
        startPlay();

        //结束游戏
        endPlay();
    }
}

优点实现了最大代码复用,父类的模板方法和已实现的某些步骤会被子类继承而直接使用。

缺点每一个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大。

访问者模式(Visitor Pattern)

访问者模式封装一些作用于某种数据结构的各元素的操作,主要将数据结构与数据操作分离,解决数据结构和操作耦合性问题,它的基本工作原理是在被访问的类里加一个对外提供接待访问者的接口。

优点符合单一职责原则,可以对功能进行统一。

缺点违背了依赖倒置原则,访问者依赖的是具体元素而不是抽象元素。

如有不对的地方,欢迎大家指正。