动机:由于类层次变化,导致违背开闭原则
class Element{
public void fun1();
//改变
public void fun2();
}
class E1 extends Element{
public void fun1(){
/...
}
//改变
public void fun2(){
***
}
}
class E2 extends Element{
public void fun1(){
/..。
}
//改变
public void fun2(){
***
}
}
在基类中更改,会给所有子类带来很大的负担,如果要将Element变为稳定,那么就传给子类方法一个对象接口,利用对象接口实现两个方法(必须稳定)变化的实现细节
这里用了双重分发
class Element{
public void fun1(Visitor vt);//根据不同的Visitor多态调用子类方法
}
class E1 extends Element{
public void fun1(Visitor vt){
/...
vt.process1(this);
//根据不同的Element子类传递参数,在visitor中多态实现调用
}
}
class E2 extends Element{
public void fun1(Visitor vt){
/..。
vt.process2(this);
}
}
class Visitor{
public void process1(Element e);
public void process2(Element e);
}
class Visitor1 extends Visitor{
@Override
public void process1(Element e){
...
}
@Override
public void process2(Element e){
...
}
}
class Visitor2 extends Visitor{
@Override
public void process1(Element e){
***
}
@Override
public void process2(Element e){
...
}
}
class Test{
public static void main(String args[]){
Element e=new E1();
Visitor vt1=new Visitor1();
e.fun1(vt1);//双重分发
//如果需要更改Element对象fun1的内容,则新增visitor2
Visitor vt2=new Visitor2();
e.fun1(vt2);
}
}
这样如果需求想要改变fun1的具体实现内容就不用改变Element和他的子类,新增visitor子类即可,但是如果需求想要新增一个Element子类,则全部都要变化,visitor基类需要增加process3
这个模式必须要求Element和他的子类必须稳定