解决的问题
Visitor Pattern是为了在不改变类本身的代码的前提下,给类添加新的特性。 例如,HTML有各种类型的节点(HtmlNode),例如HeadingNode、 AnchorNode等,需要不改变类的代码给类添加新的操作,例如HighlightOperation、PlainTextOperation等。
代码
Operation
:
package com.cong.designpattern.visitor;
public interface Operation {
public void apply(HeadingNode node);
public void apply(AnchorNode node);
}
HighLightOperation
:
package com.cong.designpattern.visitor;
public class HighlightOperation implements Operation{
@Override
public void apply(HeadingNode node) {
System.out.println("Heading Highlight");
}
@Override
public void apply(AnchorNode node) {
System.out.println("Anchor Highlight");
}
}
PlainTextOperation
:
package com.cong.designpattern.visitor;
public class PlainTextOperation implements Operation{
@Override
public void apply(HeadingNode node) {
System.out.println("Heading plain text");
}
@Override
public void apply(AnchorNode node) {
System.out.println("Anchor plain text");
}
}
HtmlNode
:
package com.cong.designpattern.visitor;
public abstract class HtmlNode {
abstract void execute(Operation operation);
}
HeadingNode
:
package com.cong.designpattern.visitor;
public class HeadingNode extends HtmlNode{
@Override
void execute(Operation operation) {
operation.apply(this);
}
}
AnchorNode
:
package com.cong.designpattern.visitor;
public class AnchorNode extends HtmlNode{
@Override
void execute(Operation operation) {
operation.apply(this);
}
}
HtmlDocument
:
package com.cong.designpattern.visitor;
import java.util.ArrayList;
import java.util.List;
public class HtmlDocument {
private List<HtmlNode> nodes = new ArrayList<>();
public void addNode(HtmlNode node) {
this.nodes.add(node);
}
public void execute(Operation operation) {
for (HtmlNode node : this.nodes) {
node.execute(operation);
}
}
}
Test code:
HtmlDocument document = new HtmlDocument();
document.addNode(new HeadingNode());
document.addNode(new AnchorNode());
document.execute(new HighlightOperation());
document.execute(new PlainTextOperation());
UML
![](https://img.haomeiwen.com/i4633505/46e07f236dd35520.png)
网友评论