访问者模式
Last updated
Last updated
package visitor
import "fmt"
type IVisitor interface {
visit(interface{})
}
// 定义一个visitor 实现IVisitor 接口
type Visitor struct {
}
// golang 中不支持重载,所以这里的visit 方法,我们需要费劲一点
func (Visitor) visit(i interface{}) {
switch i.(type) {
case FreeVideo:
video := i.(FreeVideo)
fmt.Println("Free Video " + video.name)
case VipVideo:
video := i.(VipVideo)
fmt.Printf("Vip Video %v : Price %d \n", video.name, video.price)
}
}
// IVideo 和 Video的组合 模拟一个抽象类
type IVideo interface {
accept(visitor IVisitor)
}
type Video struct {
name string
}
type FreeVideo struct {
Video
}
func (f FreeVideo) accept(visitor IVisitor) {
visitor.visit(f)
}
type VipVideo struct {
Video
price int
}
func (v VipVideo) accept(visitor IVisitor) {
visitor.visit(v)
}package visitor
func ExampleVisitor() {
videoList := []IVideo{}
freeVideo := FreeVideo{}
freeVideo.name = "一条狗的使命"
vipVideo := VipVideo{}
vipVideo.name = "流浪地球"
vipVideo.price = 6
videoList = append(videoList, freeVideo)
videoList = append(videoList, vipVideo)
for _, video := range videoList {
video.accept(Visitor{})
}
// Output:
// Free Video 一条狗的使命
// Vip Video 流浪地球 : Price 6
}package tech.selinux.design.pattern.behavioral.visitor;
/** 定义了一个访问者的接口 */
public interface IVisitor {
void visit(FreeVideo freeVideo);
void visit(VipVideo vipVideo);
}package tech.selinux.design.pattern.behavioral.visitor;
public abstract class Video {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 是否接受访问者的访问
public abstract void accept(IVisitor visitor);
}package tech.selinux.design.pattern.behavioral.visitor;
/** 定义了一个免费视频 继承了视频类 */
public class FreeVideo extends Video {
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}package tech.selinux.design.pattern.behavioral.visitor;
public class VipVideo extends Video {
private int price;
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
/** 这里会根据传入的类型调用相应的方法 */
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}package tech.selinux.design.pattern.behavioral.visitor;
public class Visitor implements IVisitor {
@Override
public void visit(FreeVideo freeVideo) {
System.out.println("Free Video " + freeVideo.getName());
}
@Override
public void visit(VipVideo vipVideo) {
System.out.println("Vip Video " + vipVideo.getName() + ": Price " + vipVideo.getPrice());
}
}package tech.selinux.design.pattern.behavioral.visitor;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<Video> videoList = new ArrayList<Video>();
FreeVideo freeVideo = new FreeVideo();
freeVideo.setName("一条狗的使命");
VipVideo vipVideo = new VipVideo();
vipVideo.setName("流浪地球");
vipVideo.setPrice(6);
videoList.add(freeVideo);
videoList.add(vipVideo);
for (Video video : videoList) {
video.accept(new Visitor());
}
}
}