2012-01-08 53 views
8

我正在关注spring tutorial今年春季教程中的糟糕做法?

在第一个接口创建ProductManager“3.2添加一些类业务逻辑。”:

package springapp.service; 

import java.io.Serializable; 
import java.util.List; 

import springapp.domain.Product; 

public interface ProductManager extends Serializable{ 

    public void increasePrice(int percentage); 

    public List<Product> getProducts(); 

} 

然后,SimpleProductManager实现类创建:

package springapp.service; 

import java.util.List; 

import springapp.domain.Product; 

public class SimpleProductManager implements ProductManager { 

    public List<Product> getProducts() { 
     throw new UnsupportedOperationException(); 
    } 

    public void increasePrice(int percentage) { 
     throw new UnsupportedOperationException();   
    } 

    public void setProducts(List<Product> products) { 
     throw new UnsupportedOperationException();   
    } 

} 

实现类增加了额外的方法setProducts()。如果接口ProductManager也不具有setProducts方法以允许使用setProducts以多态方式实例化SimpleProductManager的类。目前,这是不可能的 -

ProductManager p = new SimpleProductManager(); 
p.setProducts(); 

回答

7

接口不包括setProducts,因为该接口(可能是一个MVC控制器)的客户不应该调用它。该接口仅定义客户端应该使用的那些操作,而不是定义实现可能具有的所有方法。

setProducts方法可以被beans配置访问(例如使用<property name="products">),这允许产品在启动时静态配置。之后,客户端代码通过其受限接口引用该bean。

您的p.setProducts()示例不应该在此示例中调用,因为产品仅在bean配置中配置,而不是由业务逻辑配置。