访问者模式(Visitor Pattern)

访问者模式
在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。
优点:

  1. 符合单一职责原则。
  2. 秀的扩展性。
  3. 灵活性。

缺点:

  1. 具体元素对访问者公布细节,违反了迪米特原则。
  2. 具体元素变更比较困难。
  3. 违反了依赖倒置原则,依赖了具体类,没有依赖抽象。

UML Class Diagram

访问者模式(Visitor Pattern)_第1张图片

package visitor.pattern.demo;

/**
 * Created by 逸足天涯
 * Date: 2019/10/21.
 * Time: 14:28
 */
public interface IOriginalInterface {
    void accept(IVisitor visitor);
}

package visitor.pattern.demo;

/**
 * Created by 逸足天涯
 * Date: 2019/10/21.
 * Time: 14:29
 */
public class MyClass implements IOriginalInterface {
    private int myInt = 5;

    public int getMyInt() {
        return myInt;
    }

    public void setMyInt(int myInt) {
        this.myInt = myInt;
    }

    @Override
    public void accept(IVisitor visitor) {
        System.out.println("Initial value of the interger : " + myInt);
        visitor.visitor(this);
        System.out.println("\nValue of the integer now : " + myInt);
    }
}

package visitor.pattern.demo;

/**
 * Created by 逸足天涯
 * Date: 2019/10/21.
 * Time: 14:27
 */
public interface IVisitor {
    void visitor(MyClass myClassElement);
}

package visitor.pattern.demo;

/**
 * Created by 逸足天涯
 * Date: 2019/10/21.
 * Time: 14:31
 */
public class Visitor implements IVisitor {
    @Override
    public void visitor(MyClass myClassElement) {
        System.out.println("Visotor is trying to change the integer value");
        myClassElement.setMyInt(100);
        System.out.println("Exiting from Vistor - visit");
    }
}

package visitor.pattern.demo;



/**
 * Created by 逸足天涯
 * Date: 2019/10/21.
 * Time: 14:26
 */
public class VisitorPatternEx {
    public static void main(String[] args) {
        System.out.println("****Visitor Pattern Demo***");
        IVisitor v = new Visitor();
        MyClass myClass = new MyClass();
        myClass.accept(v);
    }
}

你可能感兴趣的:(设计模式)