Nim*_*rod 5 java multiple-inheritance
我有一个父类 -Product
public abstract class Product {}
Run Code Online (Sandbox Code Playgroud)
并扩展了3个子类:
public class Vinyl extends Product {}
public class Book extends Product {}
public class Video extends Product {}
所有子类都preview()使用其特定实现覆盖该方法.现在,我有一个新的设计需求:我需要定义一个&的组合项目,它也有一个方法(这是乙烯基和书籍的组合).在说明中它说我可以创建Interface\class字段成员或我想支持它的任何实现,但我不确定如何.vinylbookpreview()
新设计是否也应该用inheritance或者我应该改变当前的设计?
新设计是否也应该通过继承实现,还是应该更改当前设计?
新设计可以纯粹用继承实现.但是真正的问题在于你会有太多的子类.您可以轻松地创建一个新的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模式.
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |