简介:
本文是个系列一次会出两个设计者模式作用,如果有关联就三个,除此外还会讲解在spring中作用。
23设计者模式以及重点模式
我们都知道设计者模式有3类23种设计模式,标红是特别重要的设计者模式建议都会,而且熟读于心,标蓝是指其次重要建议也要明白。
(1)创建型模式:单例模式、抽象工厂模式、构建者模式、工厂模式、原型模式。
(2)结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
(3)行为型模式:访问者模式、模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式。
命令模式(Command Pattern)
命令模式是一种行为型设计模式,它将请求或简单的操作封装成一个对象。这种模式的主要目的是将请求发送者与接收者解耦,使得发送者和接收者不直接交互。命令模式允许将请求排队处理、记录请求日志以及实现可撤销的操作。
组成部分:
- 命令接口(Command):定义执行操作的接口。
- 具体命令(ConcreteCommand):实现命令接口的类,定义了接收者和动作之间的绑定关系。
- 接收者(Receiver):知道如何实施和执行一个请求相关的操作。
- 调用者(Invoker):要求命令对象执行请求。
- 客户端(Client):创建具体命令对象,并设置其接收者。
命令模式 主要用于将操作的请求者和执行者解耦,允许将请求封装成对象,从而使用不同的请求、队列或日志参数化其他对象,并支持可撤销的操作。
示例
// 命令接口
interface Command {
void execute();
}
// 接收者
class Light {
public void turnOn() {
System.out.println("The light is on");
}
public void turnOff() {
System.out.println("The light is off");
}
}
// 具体命令
class TurnOnCommand implements Command {
private Light light;
public TurnOnCommand(Light light) {
this.light = light;
}
public void execute() {
light.turnOn();
}
}
class TurnOffCommand implements Command {
private Light light;
public TurnOffCommand(Light light) {
this.light = light;
}
public void execute() {
light.turnOff();
}
}
// 调用者
class RemoteControl {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void pressButton() {
command.execute();
}
}
// 客户端
public class CommandPatternDemo {
public static void main(String[] args) {
Light light = new Light();
Command turnOn = new TurnOnCommand(light);
Command turnOff = new TurnOffCommand(light);
RemoteControl control = new RemoteControl();
control.setCommand(turnOn);
control.pressButton();
control.setCommand(turnOff);
control.pressButton();
}
}
在这个例子中,Light
是一个接收者,TurnOnCommand
和 TurnOffCommand
是具体命令,它们实现了 Command
接口。RemoteControl
是调用者,它通过 pressButton
方法来执行命令。客户端代码创建了命令对象并将其与接收者关联。
迭代器模式(Iterator Pattern)
迭代器模式是一种行为型设计模式,它提供一种方法来顺序访问聚合对象中的各个元素,而又无需暴露该对象的内部表示。
组成部分:
- 迭代器接口(Iterator):定义访问和遍历元素的接口。
- 具体迭代器(ConcreteIterator):实现迭代器接口,负责管理当前元素的位置,并能够计算出下一个元素。
- 聚合接口(Aggregate):定义创建相应迭代器对象的接口。
- 具体聚合(ConcreteAggregate):实现聚合接口,返回一个具体迭代器的实例。
迭代器模式 用于顺序访问集合对象的元素,而不需要暴露其底层表示,提供了一种统一的方法来遍历各种类型的集合。
示例
import java.util.*;
// 迭代器接口
interface Iterator {
boolean hasNext();
Object next();
}
// 聚合接口
interface Container {
Iterator getIterator();
}
// 具体聚合
class NameRepository implements Container {
public String names[] = {"John", "Doe", "Jane", "Smith"};
@Override
public Iterator getIterator() {
return new NameIterator();
}
private class NameIterator implements Iterator {
int index;
@Override
public boolean hasNext() {
return index < names.length;
}
@Override
public Object next() {
if (this.hasNext()) {
return names[index++];
}
return null;
}
}
}
// 客户端
public class IteratorPatternDemo {
public static void main(String[] args) {
NameRepository namesRepository = new NameRepository();
for (Iterator iter = namesRepository.getIterator(); iter.hasNext();) {
String name = (String) iter.next();
System.out.println("Name : " + name);
}
}
}
在这个示例中,NameRepository
是一个具体聚合,它实现了 Container
接口,并内部定义了 NameIterator
,这是一个具体的迭代器实现。客户端通过 NameRepository
的 getIterator
方法获取迭代器,并使用它来遍历名称。