访问器

动机:由于类层次变化,导致违背开闭原则

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和他的子类必须稳定

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值