zoukankan      html  css  js  c++  java
  • 设计模式(行为模式) 之 访问者模式

    访问者模式目的:

    封装一些施加于某种数据结构元素之上的操作,一旦这些操作需要修改,接受这些操作的数据结构可以保持不变。

    为不同类型的元素提供多种访问操作方式,且可以在不修改原有系统的情况下增加新的操作方式。

    访问者模式的四种角色:

    1,抽象事物功能接口,定义了固定方法及可变功能方法接口;

    2,具体的功能实现类;

    3,访问者接口,为所有访问者对象声明一个 visit 方法,用来代表为对象结构添加的功能,原则上可以代表任意的功能;

    4,具体访问者的实现类,实现要真正被添加到对象结构中的功能。

    举例:(可能不太恰当,但能说明意思)“人,会哭 会笑;还有很多特性如:喜欢、讨厌等”


    /**
    * 人
    */
    public interface Person {
    /**
    * 哭
    */
    void cry();

    /**
    * 笑
    */
    void smile();

    /**
    * 其它
    *
    * @param visitor
    * @return
    */
    Object accept(IVisitor visitor);
    }

    public class ChinaPerson implements Person {
    String name = "";

    public ChinaPerson(String name) {
    this.name = name;
    }

    public String getName() {
    return name;
    }

    @Override
    public void cry() {
    System.out.println(name + " 哭");
    }

    @Override
    public void smile() {
    System.out.println(name + " 笑");
    }

    @Override
    public Object accept(IVisitor visitor) {
    return visitor.visit(this);
    }
    }
    /**
    * 访问者接口
    */
    public interface IVisitor {
    Object visit(ChinaPerson chinaPerson);
    }
    public class Hate implements IVisitor {
    @Override
    public Object visit(ChinaPerson chinaPerson) {
    System.out.println(chinaPerson.getName() + " 讨厌岛国");
    return null;
    }
    }
    public class Like implements IVisitor {
    @Override
    public Object visit(ChinaPerson chinaPerson) {
    System.out.println(chinaPerson.getName() + " 喜欢中国");
    return null;
    }
    }

    执行:
    public static void main(String[] args) {
    ChinaPerson chinaPerson = new ChinaPerson("中国人");
    chinaPerson.cry();
    chinaPerson.smile();
    chinaPerson.accept(new Hate());
    chinaPerson.accept(new Like());
    }
    结果:

    
    
  • 相关阅读:
    173. Binary Search Tree Iterator
    199. Binary Tree Right Side View
    230. Kth Smallest Element in a BST
    236. Lowest Common Ancestor of a Binary Tree
    337. House Robber III
    449. Serialize and Deserialize BST
    508. Most Frequent Subtree Sum
    513. Find Bottom Left Tree Value
    129. Sum Root to Leaf Numbers
    652. Find Duplicate Subtrees
  • 原文地址:https://www.cnblogs.com/fish-in-sky/p/6540453.html
Copyright © 2011-2022 走看看