Visitor Pattern

Visitor pattern is a better design when we have extendable visitor list but operate on pretty stable element list, we can easily extend the visitor and give specific implementation methods without touching exisitng code.

There are several roles in visitor pattern, visitor (operator), elements (visotor operates on), object structure which will maintian the visitor list.

Take an example, we have a tour company, have a stable resort list: Great Wall, Taj Mahal and Grand palace, but the tourist group can always change and they may raise special request during the tour, we can apply visitor pattern to solve it.

Concrete visitor class will provide visit method implement details,

/**
 * @Author Carter Deng
 * @Date 2021/11/13
 * Concrete visitor class
 */
public class Carter extends Visitor {

    private String visitorName = "Carter";

    @Override
    public void visitGreatWall(GreatWall greatWall) {
        System.out.println(visitorName + " comes to visit Great Wall");
    }

    @Override
    public void visitTajMahal(TajMahal tajMahal) {
        System.out.println(visitorName + " comes to visit Taj Mahal");
    }
}

for each concrete resort class, it will provide accept method, which will call back of visitor class visit method, just allow visitor is able to visit the concrete emelement.

/**
 * @Author Carter Deng
 * @Date 2021/11/13
 * Concrete element class
 */
public class TajMahal extends Resort{

    @Override
    public void accept(Visitor visitor) {
        visitor.visitTajMahal(this);
    }
}

Object structure class will maintain concrete visitor list.

/**
 * @Author Carter Deng
 * @Date 2021/11/13
 */
public class ObjectStrcture {

    private List<Visitor> visitors;

    public ObjectStrcture() {
        this.visitors = new ArrayList<>();
    }

    public List<Visitor> addVisitor(Visitor v){
        this.visitors.add(v);
        return this.visitors;
    }

    public void displayVisitList(){
        this.visitors.forEach(visitor->visitor.visitGreatWall(new GreatWall()));
        this.visitors.forEach(visitor->visitor.visitTajMahal(new TajMahal()));
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值