如何合理设计多个子类的组合?

Nim*_*rod 5 java multiple-inheritance

我有一个父类 -Product

public abstract class Product {}
Run Code Online (Sandbox Code Playgroud)

并扩展了3个子类:

  1. public class Vinyl extends Product {}

  2. public class Book extends Product {}

  3. public class Video extends Product {}

所有子类都preview()使用其特定实现覆盖该方法.现在,我有一个新的设计需求:我需要定义一个&的组合项目,它也有一个方法(这是乙烯基和书籍的组合).在说明中它说我可以创建Interface\class字段成员或我想支持它的任何实现,但我不确定如何.vinylbookpreview()

新设计是否也应该用inheritance或者我应该改变当前的设计?

CKi*_*ing 5

新设计是否也应该通过继承实现,还是应该更改当前设计?

新设计可以纯粹用继承实现.但是真正的问题在于你会有太多的子类.您可以轻松地创建一个新的Product被调用子类VinylBook并完成它.但是,当你必须引入另一种组合时会发生什么VinylVideo.您还必须为此创建一个新的子类,依此类推.

解决方案是一起使用继承和组合.复合模式非常适合这个问题.根据维基百科:

复合模式描述了一组对象的处理方式与对象的单个实例相同.通过实现复合模式,客户可以统一处理单个对象和组合.

让我们从定义一个开始 CompositeProduct

public class CompositeProduct` extends Product {
     private List<Product> products;

     public CompositeProduct(List<Product> products) { this.products = products }

     public String preview() {
          String previewText = "";
          for(Product product : products) { previewText+=product.preview(); }
          return preview;

     }
}
Run Code Online (Sandbox Code Playgroud)

您现在拥有复合产品,其行为就像是一个单一产品,允许您动态创建组合产品,而无需为每个组合创建新的子类.

您可以动态创建产品的示例:

Book book = new Book();
Vinyl vinyl = new Vinyl();
List<Product> products = new List<>();
products.add(book);
products.add(vinyl);
CompositeProduct vinylBook = new CompositeProduct(products);
Run Code Online (Sandbox Code Playgroud)

如果您希望动态地为产品添加其他行为,也可以查看Decorator模式.