这个设计具体该如何实现?当前有一个接口IValidatable和两个需要实现这个接口的类Composite,Dialog

public interface IValidatable{
   public boolean isValid();
   public void computeValid();
   public void addValidator(IInputValidator validator);
   public List<IInputValidator> getValidators();
   public void addValidators(IInputValidator[] validators);
}


现在在一个GUI(SWT)程序的设计中有两种类型的对象需要实现这个接口,
一个是Composite的扩展类ValidatableComposite,
一个是Dialog的扩展类ValidatableDialog(Composite and Dialog都非接口而是实际类).

假定这两个类内部对
public void addValidator(IInputValidator validator);
public List<IInputValidator> getValidators();
public void addValidators(IInputValidator[] validators);
三个方法的的实现是一致的.

请问有什么办法可以避免在ValidatableComposite和ValidatableDialog重复实现那三个方法?
评论
yongyuan.jiang 2007-11-02
如daniel.wuz所言
使用组合,代替继承,将实际逻辑算法抽象到DefaultValidatable 类中,
派生类使用DefaultValidatable接口,这是Bridge模式:一组派生类(Composite等),使用一组实现(本例只有一个实现)。

这里体现了组合优于继承原则。
daniel.wuz 2007-11-02
忘了模式名了

接口:
public interface IValidatable {
	public boolean isValid();

	public void computeValid();

	//以下三个方法在子类中的实现是一样的
	public void addValidator(IInputValidator validator);

	public List<IInputValidator> getValidators();

	public void addValidators(IInputValidator[] validators);
}


标准实现:
public class DefaultValidatable implements IValidatable {

	@Override
	public void addValidator(IInputValidator validator) {

	}

	@Override
	public void addValidators(IInputValidator[] validators) {

	}

	//实现三个方法
	@Override
	public void computeValid() {
		System.out.println("say hi to every one");
	}

	@Override
	public List<IInputValidator> getValidators() {
		return null;
	}

	@Override
	public boolean isValid() {
		return false;
	}

}


Composite:
public class Composite extends Component implements IValidatable {
	private IValidatable defaultvalidate = null;
	
	public Composite(){
		this(new DefaultValidatable());
	}
	
	public Composite(IValidatable defaultvalidate){
		this.defaultvalidate = defaultvalidate;
	}

	@Override
	public void addValidator(IInputValidator validator) {

	}

	@Override
	public void addValidators(IInputValidator[] validators) {
		//委派给标准实现
		defaultvalidate.addValidators(validators);
	}

	@Override
	public void computeValid() {
		// TODO Auto-generated method stub

	}

	@Override
	public List<IInputValidator> getValidators() {
		// TODO Auto-generated method stub
		return null;
	}

}
chbest 2007-11-02
10916621 写道
不能使用抽象类么?

我觉得抽象类就解决了
10916621 2007-11-02
不能使用抽象类么?
timonzhang 2007-11-01
liusu 写道
silentlakeside 写道
另外建一个类,该类实现这些验证方法,然后ValidatableComposite和ValidatableDialog调用该类来实现IValidatable接口。

也就是最终还是要实现这些方法两遍?


不懂LZ的意思,这里实现方法的只有第3个类.
jimmy_c 2007-10-31
IValidatable中extract一个IValidatorList接口,定义一个DefaultValidatorList派生于IValidatorList,实现公用的代码部分。
ValidatableComposite和ValidatableDialog通过代理模式使用DefaultValidatorList实现IValidatable中对应的接口。
lsy 2007-10-31
新建一个类实现这三个方法,并将其引入到ValidatableComposite和ValidatableDialog中。
mreay 2007-10-30
建议看看head first设计模式此书,第一章就可以解决此问题了!
liusu 2007-10-30
silentlakeside 写道
另外建一个类,该类实现这些验证方法,然后ValidatableComposite和ValidatableDialog调用该类来实现IValidatable接口。

也就是最终还是要实现这些方法两遍?
silentlakeside 2007-10-30
另外建一个类,该类实现这些验证方法,然后ValidatableComposite和ValidatableDialog调用该类来实现IValidatable接口。
kaneg 2007-10-30
可惜Java只能单继承,貌似做不到
liusu 2007-10-30
Composite,Dialog是SWT库中的类,我只能使用不能对其进行更改.

其实就是这样:
我的
ValidatableComposite extends Compsite implements IValidatable

,同样
ValidatableDialog extends Dialog implements IValidatable

这样ValidatableComposite和ValidatableDialog就没有办法同时继承另外一个AbstractValidatable 类了.
hyhongyong 2007-10-30
定义一个Composite,Dialog的共通抽象父类实现接口中的三个方法。
JaNer 2007-10-30
父类B实现接口A,子类CD继承父类B,这样不可以么.愚见!
发表评论

提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则

您还没有登录,请登录后发表评论

liusu
搜索本博客
博客分类
最近加入圈子
存档
最新评论