返回

设计模式揭秘:解剖十一种行为型模式,代码实现实例让你醍醐灌顶

后端

走进行为型模式的魅力世界:掌握对象交互的艺术

在软件开发的迷人世界中,设计模式就像璀璨的星光,指引着我们代码的航向。行为型模式作为设计模式家族中不可或缺的一员,凭借其对对象交互的精湛控制,备受程序员的青睐。在这篇文章中,我们将踏上一段探索行为型模式的神奇之旅,了解它们如何赋予我们的代码灵活、可扩展和可维护的非凡魅力。

1. 策略模式:因地制宜,运筹帷幄

策略模式是适应变化的强大武器。它巧妙地将算法或行为与使用它们的类分离,允许你轻松更换算法,而不影响客户端代码。就像在战场上运筹帷幄一样,策略模式让你灵活应变,掌控全局。

示例:

// Interface for different sorting algorithms
interface SortStrategy {
    void sort(int[] arr);
}

// Bubble sort strategy
class BubbleSortStrategy implements SortStrategy {
    @Override
    public void sort(int[] arr) {
        // Implement bubble sort algorithm
    }
}

// Merge sort strategy
class MergeSortStrategy implements SortStrategy {
    @Override
    public void sort(int[] arr) {
        // Implement merge sort algorithm
    }
}

// Context class that uses the strategy
class SortingContext {
    private SortStrategy strategy;

    public void setStrategy(SortStrategy strategy) {
        this.strategy = strategy;
    }

    public void sort(int[] arr) {
        strategy.sort(arr);
    }
}

2. 观察者模式:千里眼,洞察全局

观察者模式就像千里眼,让对象可以订阅它们感兴趣的事件。当事件发生时,这些对象会自动收到通知,并做出相应的反应。它创造了一种松散耦合且高效的信息传递机制。

示例:

// Interface for observers
interface Observer {
    void update();
}

// Concrete observer class
class ConcreteObserverA implements Observer {
    @Override
    public void update() {
        // React to event
    }
}

// Subject class that manages observers
class Subject {
    private List<Observer> observers = new ArrayList<>();

    public void addObserver(Observer observer) {
        observers.add(observer);
    }

    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update();
        }
    }
}

3. 迭代器模式:漫步容器,游刃有余

迭代器模式就像一位经验丰富的旅行者,可以轻松地遍历容器中的元素。它与容器的具体实现细节无关,让你专注于访问数据本身。代码因此变得简洁优雅,仿佛在容器中漫步,游刃有余。

示例:

// Interface for iterators
interface Iterator<T> {
    boolean hasNext();

    T next();
}

// Concrete iterator class
class ListIterator<T> implements Iterator<T> {
    private List<T> list;
    private int index = 0;

    public ListIterator(List<T> list) {
        this.list = list;
    }

    @Override
    public boolean hasNext() {
        return index < list.size();
    }

    @Override
    public T next() {
        return list.get(index++);
    }
}

4. 命令模式:一呼百应,弹指间完成任务

命令模式就像一位威严的将军,可以将一组操作封装成一个命令对象。只需发出一个命令,你就可以完成一系列复杂的任务。代码由此变得清晰可控,仿佛一呼百应,弹指间完成任务。

示例:

// Interface for commands
interface Command {
    void execute();
}

// Concrete command class
class TurnOnLightCommand implements Command {
    private Light light;

    public TurnOnLightCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.turnOn();
    }
}

// Invoker class that executes commands
class Invoker {
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void executeCommand() {
        command.execute();
    }
}

5. 责任链模式:层层递进,逐级解决问题

责任链模式就像一个高效的客服中心,将请求逐级传递给不同的处理者,直到找到合适的处理者为止。它让代码更加灵活健壮,仿佛层层递进,逐级解决问题,直至真相大白。

示例:

// Interface for handlers
interface Handler {
    boolean handleRequest(Request request);
}

// Concrete handler class
class HandlerA implements Handler {
    @Override
    public boolean handleRequest(Request request) {
        // Handle request and return true if handled, false otherwise
    }
}

// Handler chain class that manages handlers
class HandlerChain {
    private List<Handler> handlers = new ArrayList<>();

    public void addHandler(Handler handler) {
        handlers.add(handler);
    }

    public boolean handleRequest(Request request) {
        for (Handler handler : handlers) {
            if (handler.handleRequest(request)) {
                return true;
            }
        }
        return false;
    }
}

6. 备忘录模式:时光倒流,重现昔日风采

备忘录模式就像时光机,可以将对象的状态保存下来,并在需要的时候恢复到该状态。代码因此变得更加灵活可靠,仿佛在时间长河中穿梭,重现昔日风采。

示例:

// Originator class that creates and stores state
class Originator {
    private String state;

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

    public String getState() {
        return state;
    }

    public Memento createMemento() {
        return new Memento(state);
    }

    public void restoreMemento(Memento memento) {
        state = memento.getState();
    }
}

// Memento class that stores state
class Memento {
    private String state;

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

    public String getState() {
        return state;
    }
}

7. 状态模式:千变万化,游刃有余

状态模式就像一位多面手,可以根据不同的状态做出不同的行为。代码由此变得更加灵活健壮,仿佛在不同状态之间切换自如,游刃有余。

示例:

// Interface for states
interface State {
    void doAction();
}

// Concrete state class
class ConcreteStateA implements State {
    @Override
    public void doAction() {
        // Perform action for state A
    }
}

// Context class that manages states
class Context {
    private State state;

    public void setState(State state) {
        this.state = state;
    }

    public void doAction() {
        state.doAction();
    }
}

8. 访问者模式:洞察本质,抽丝剥茧

访问者模式就像一位经验丰富的侦探,可以访问并操作对象内部的数据,而无需了解对象的具体类型。代码因此变得更加灵活可扩展,仿佛抽丝剥茧,洞察事物的本质。

示例:

// Interface for visitors
interface Visitor {
    void visitElementA(ElementA elementA);

    void visitElementB(ElementB elementB);
}

// Concrete visitor class
class ConcreteVisitor implements Visitor {
    @Override
    public void visitElementA(ElementA elementA) {
        // Visit element A
    }

    @Override
    public void visitElementB(ElementB elementB) {
        // Visit element B
    }
}

// Element class that accepts visitors
class Element {
    public void acceptVisitor(Visitor visitor) {
        visitor.visitElement(this);
    }
}

9. 中介者模式:居中协调,化繁为简

中介者模式就像一位和蔼可亲的调解员,可以协调多个对象之间的交互,使它们之间无需直接通信。代码由此变得更加简洁易懂,仿佛化繁为简,让复杂的问题变得清晰明了。

示例:

// Interface for mediators
interface Mediator {
    void sendRequest(Request request, Colleague colleague);
}

// Concrete mediator class
class ConcreteMediator implements Mediator {
    private ColleagueA colleagueA;
    private ColleagueB colleagueB;

    public void setColleagueA(ColleagueA colleagueA) {