设计问题:增强代码可重用性的具体案例



我有一些View子类的实例(如ImageView、ViewGroup、TextView等),我让它们都实现两个方法a()和b(),它们都必须运行相同的init()方法,该方法很长,对所有这些方法都做相同的操作。在这种情况下,我应该如何设计我的体系结构来增强代码的可重用性?

如果是C++,我可以从视图和一个在创建时运行init()并具有abstract方法a()和b()的新抽象类中进行多重继承,那么它在Java中是如何实现的?

也许有什么方法可以用某种装饰器来实现它?

如果我理解正确,您可以创建一个抽象类AbstractView来扩展View并实现您的通用init()方法。AbstractView应该声明抽象方法a()b(),但将实现留给子类。

public abstract class AbstractView extends View {
public void init() {
// common init implementation here
}
public abstract void a();
public abstract void b();
}

由于您正试图将行为添加到一组现有的子类(ImageViewViewGroupTextView等)中,因此您可能需要为每个子类创建一个包装器(MyImageViewMyViewGroupMyTextView等)。这些子类中的每个都将扩展AbstractView并实现自己的a()b()方法,但是继承通用的init()方法(以及View类中实现的所有方法)。然后,您可以为ImageViewViewGroupTextView等中的现有行为创建需要保持不变的委托方法。

public class MyImageView extends AbstractView {
private ImageView wrappedImageView;
public MyImageView(Context context) {
wrappedImageView = new ImageView(context);
}
// TODO: Implement other constructor wrappers
final void clearColorFilter() {
wrappedImageView.clearColorFilter();
}
// TODO: Implement other method wrappers
@Override
public void a() {
// specific implementation here
}
@Override
public void b() {
// specific implementation here
}
}

您需要一个带有init()方法的新抽象类:

public abstract class MyAbstractView extends View {
public void init() {
//TODO: implement init 
}
public abstract void a();
public abstract void b();
}

让您的类(ImageView、TextView)从这个抽象类继承。

如果我正确地不想要你的答案,你应该做的是:

public abstract class MyBaseView extends View{
public MyBaseView(Context context) {
super(context);
init();
// TODO Auto-generated constructor stub
}

private void init(){
}
public abstract void a();
public abstract void b();
}

然后使用再次扩展

public class MyView extends MyBaseView{
public MyView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@Override
public void a() {
// TODO Auto-generated method stub
}
@Override
public void b() {
// TODO Auto-generated method stub
}
}

您可以定义一个实现方法init()a()b()的类层次结构。根据层次结构中的子类,在具有的步骤中添加内容。最后,您的视图将调用此类上的方法并为其自身生成内容。

interface WidgetContent {
void init();
void a();
void b();
}
abstract class AbstractWidgetContent implements WidgetContent  {
public void init(){}
public abstract void a();
public abstract void b();
}
class BaseViewWidgetContent extends AbstractWidgetContent {
public void a() {
}
public void b() {
}
}
class ImageViewWidgetContent extends BaseViewWidgetContent {
public void a() {
}
public void b() {
}
}
class PictureView extends ImageView{
ImageViewWidgetContent imageContent;
}

最新更新