访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。
优点:
符合单一职责原则。
优秀的扩展性。
灵活性。
缺点:
具体元素对访问者公布细节,违反了迪米特原则。
具体元素变更比较困难。
违反了依赖倒置原则,依赖了具体类,没有依赖抽象。
使用场景:
对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。
需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,也不希望在增加新操作时修改这些类。
public intece Visitable {
void accept(Visitor v);
}public class ConcreteElementA implements Visitable {
@Override
public void accept(Visitor v) {
v.visit(this);
}
public void operate() {
System.out.println("ConcreteElementA ....");
}
}public class ConcreteElementB implements Visitable {
@Override
public void accept(Visitor v) {
v.visit(this);
}
public void operate() {
System.out.println("ConcreteElementB ....");
}
}public intece Visitor {
void visit(ConcreteElementB able);
void visit(ConcreteElementA able);
}public class ConcreteVisitorA implements Visitor {
@Override
public void visit(ConcreteElementB able) {
able.operate();
}
@Override
public void visit(ConcreteElementA able) {
able.operate();
}
}public class ConcreteVisitorB implements Visitor {
@Override
public void visit(ConcreteElementB able) {
}
@Override
public void visit(ConcreteElementA able) {
}
}public class Client {
public static void main(String[] args) {
Visitor v1 = new ConcreteVisitorA();
List<Visitable> list = new ArrayList<>();
list.add(new ConcreteElementA());
list.add(new ConcreteElementB());
for(Visitable able :list){
able.accept(v1);
}
}
}
其实在工作中,我们会使用到很多设计模式。可能有时候你并不知道它是一种设计模式,只是你觉得这样使用比较方便。所以,系统的学习并尝试去使用设计模式的组合,养成一种良好的设计习惯,是很有必要的。
除了上述23种常规设计模式外,还衍生出了一些其它的设计模式。后续文章中会慢慢讲到
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33899-20.html
再一个盗版盛行
金华王子们又受打击