Java 设计问题:增强特定情况下的代码重用性
我有几个视图子类的实例(如ImageView、ViewGroup、TextView等),我让它们都实现了两个方法a()和b(),它们都必须运行相同的init()方法,这个方法很长,对它们都是一样的。 在这种情况下,我应该如何设计我的体系结构来增强代码的可重用性Java 设计问题:增强特定情况下的代码重用性,java,android,design-patterns,Java,Android,Design Patterns,我有几个视图子类的实例(如ImageView、ViewGroup、TextView等),我让它们都实现了两个方法a()和b(),它们都必须运行相同的init()方法,这个方法很长,对它们都是一样的。 在这种情况下,我应该如何设计我的体系结构来增强代码的可重用性 如果是C++,可以从视图中多继承,在创建时运行一个新的抽象类,并且具有ab方法(a)和(),它是如何在java中实现的?< /p> 也许有什么办法可以通过某种装饰来实现 如果我理解正确,您可以创建一个抽象类AbstractView,该类扩
如果是C++,可以从视图中多继承,在创建时运行一个新的抽象类,并且具有ab方法(a)和(),它是如何在java中实现的?< /p>
也许有什么办法可以通过某种装饰来实现 如果我理解正确,您可以创建一个抽象类
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();
}
由于您试图向一组现有子类(ImageView
、ViewGroup
、TextView
等)添加行为,因此可能需要为每个子类(MyImageView
、MyViewGroup
、MyTextView
等)创建一个包装器。这些子类中的每一个子类都将扩展AbstractView
并实现它们自己的a()
和b()
方法,但继承公共init()
方法(以及视图
类中实现的所有方法。然后,您可以为图像视图
、视图组
、文本视图
等中需要保持不变的现有行为创建委托方法
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()方法创建一个新的抽象类:
让您的类(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;
}
我将创建一个单独的“Globals”类,您可以将多个活动使用的方法放在其中,并从需要它们的类中调用它们。在每个类中,当您需要时,只需调用“Globals.a()“不能说我完全同意这种方法。@codeMagic这是结构化编程,应该避免使用。
视图
也可以声明为定义所有视图都应该绑定到的契约的接口。@ArunManivannan这是可能的,但安卓已经有了一个视图
类。不清楚操作正在扩展它,或者从头开始。哎哟。没有注意到“android”标记。很抱歉。@OfekRon哦,我没有意识到ImageView、ViewGroup、TextView等都是内置类。@OfekRon看到我的更新了。这很棘手(读“凌乱”)因为你试图在一个超级类和它的子类之间添加新的行为。它们不是我的类,imageview等都是在android中构建的,这就是为什么我没有正确使用这种方法的基本原因away@OfekRon如果这些类是内置的,那么如何实现:我让它们都实现了两个方法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;
}