这个春季教程的不良做法?

blu*_*sky 8 java spring spring-mvc

我正在关注春季教程.

在"3.2.为业务逻辑添加一些类"一节ProductManager中,创建了一个接口:

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();

}
Run Code Online (Sandbox Code Playgroud)

然后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();        
    }

}
Run Code Online (Sandbox Code Playgroud)

实现类添加了一个额外的方法setProducts().接口ProductManager是否还应该有一个setProducts方法来允许setProducts用于SimpleProductManager多态实例化的类.目前这是不可能的 -

ProductManager p = new SimpleProductManager();
p.setProducts();
Run Code Online (Sandbox Code Playgroud)

ska*_*man 7

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

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

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