java - 更改一个对象的属性时替换重复代码的设计模式

标签 java design-patterns

我有 4 个自定义微调器,用于修改一个选定小部件的宽度、高度、X 位置和 Y 位置。我的小部件可以在屏幕上四处拖动,我的想法是使用这些微调器来更改某些属性,例如宽度或高度,并立即查看更改的效果。 是否有一种模式可用于仅用一个替换所有这些类(XSpinnerListener、YSpinnerListener...)并指示我当前对象(JButton)的哪个属性需要更改?这是一个好的设计方法吗?

public void init(){
    widthSpinner.setListener(new WidthSpinnerListener());
    heightSpinner.setListener(new HeightSpinnerListener());
    xSpinner.setListener(new XSpinnerListener());
    ySpinner.setListener(new YSpinnerListener());
}


public class XSpinnerListener implements SpinnerListener {

    @Override
    public void spinnerValueChanged() {
         current.setLocation(xSpinner.getValue(), current.getY());
    }
}

public class YSpinnerListener implements SpinnerListener {

    @Override
    public void spinnerValueChanged() {
        current.setLocation(current.getX(), ySpinner.getValue());
    }
}

public class WidthSpinnerListener implements SpinnerListener {

    @Override
    public void spinnerValueChanged() {
         current.setSize(widthSpinner.getValue(), current.getHeight());
    }
}

public class HeightSpinnerListener implements SpinnerListener {

    @Override
    public void spinnerValueChanged() {
         current.setSize(current.getWidth(), heightSpinner.getValue());
    }
 }

最佳答案

一些沉思......

您可以通过为您的 SpinnerListener spinnerValueChanged(...) 方法提供一个 SpinnerEvent 参数来模拟 Swing 的设计,该参数指示正在更改的轴。轴可以用枚举封装,...

enum Axis {
   X("X"), Y("Y"), WIDTH("Width"), HEIGHT("Height");

   private String name;

   private Axis(String name) {
      this.name = name;
   }

   public String getName() {
      return name;
   }

}

SpinnerEvent 参数类可能类似于:

class SpinnerEvent {
   private Object source;
   private Axis axis;
   private int value;

   public SpinnerEvent(Object source, Axis axis, int value) {
      this.source = source;
      this.axis = axis;
      this.value = value;
   }

   public Object getSource() {
      return source;
   }

   public Axis getAxis() {
      return axis;
   }

   public int getValue() {
      return value;
   }

}

您的 SpinnerListener 接口(interface)(您没有向我们展示)必须更改:

interface SpinnerListener {
   public void SpinnerValueChanged(SpinnerEvent e);
}

也许您的具体实现可以在实现 Movable 接口(interface)的对象上工作:

interface Movable {

   public abstract int getX();
   public abstract void setX(int x);
   public abstract int getY();
   public abstract void setY(int y);
   public abstract int getWidth();
   public abstract void setWidth(int width);
   public abstract int getHeight();
   public abstract void setHeight(int height);
   public abstract void move(Axis axis, int value);
}

使用关键方法,可以像这样实现的移动:

@Override
public void move(Axis axis, int value) {
  switch (axis) {
  case X:
     x += value;
     break;
  case Y:
     y += value;
     break;
  case WIDTH:
     width += value;
     break;
  case HEIGHT:
     height += value;
  default:
     break;
  }
}

小的具体实现

class ConcreteSpinnerListener implements SpinnerListener {
   private Movable movable;

   public ConcreteSpinnerListener(Movable movable) {
      this.movable = movable;
   }

   @Override
   public void SpinnerValueChanged(SpinnerEvent e) {
      movable.move(e.getAxis(), e.getValue());
   }

}

关于java - 更改一个对象的属性时替换重复代码的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30146598/

相关文章:

java - 从 Java 调用 Kotlin 高阶函数?

.net - EF Core 处理多个预订请求并发的理想方法

vb.net - 静态局部变量是不好的做法吗?

java - LEFT JOIN FETCH 不起作用

php - OO 设计模式与 PHP 中的 Web 开发有多相关?

java - 为不同实例调用不同函数的设计模式

c# - 如何检查列表是否包含字节数组?

java - 如何使jtable中的一行不可选择?

java - 如何使用DataInputStream从文件中读取二进制数据并打印到控制台?

java - 在 JPanel 上绘制多个 JComponent 不起作用