學習'SOLID'原理我想知道如果我需要爲類添加更多擴展,修改構造函數就可以了,例如。商業邏輯。帶構造函數的開閉原理
從我學到的它看起來像修改構造函數我違反'開放 - 封閉'的原則,但如果我需要注入另一個類來執行一些邏輯呢?我如何在沒有構造器修改的情況下做到這一點,一般來說,構造器修改是否違反了「開放 - 封閉」的原則?
讓我們來看一個例子。
有一個接口
public interface ShopFactory {
List<Discount> getDiscounts();
List<Sale> getSales();
}
而且還有一個執行(也可能是,如果有人想我的媒體庫添加爲依賴有可能是其他人)
public class CountableDefaultShopFactory implements ShopFactory {
Counter discountsCounter;
Counter salesCounter;
public DefaultShopFactory(Counter discountsCounter, Counter salesCounter) {
this.discountsCounter = discountsCounter;
this.salesCounter = salesCounter;
}
@Override
List<Discount> getDiscounts() {
discountsCounter.count();
return Discount.defaultDiscounts();
}
@Override
List<Sale> getSales() {
salesCounter.count();
return Sale.defaultSales();
}
}
所以這是非常簡單的。 CountableDefaultShopFactory
implements ShopFactory
覆蓋了兩種方法,並依賴於某些Counter
對象來計算每個方法被調用的次數。每種方法都使用靜態方法返回一些數據。
現在讓我們說,我被要求添加一個方法,這次我需要從某個存儲中獲取數據,並且有一個服務從該存儲提供一些數據。在這種情況下,我需要在我的課程中注入此服務以執行操作。
而且它會看起來像這樣:
public class CountableDefaultShopFactory implements ShopFactory {
Counter discountsCounter;
Counter salesCounter;
Counter couponsCounter;
CouponDAO couponDAO;
public DefaultShopFactory(Counter discountsCounter, Counter salesCounter, Counter couponsCounter, CouponDAO couponDAO) {
this.discountsCounter = discountsCounter;
this.salesCounter = salesCounter;
this.couponsCounter = couponsCounter;
this.couponDAO = couponDAO;
}
@Override
List<Discount> getDiscounts() {
discountsCounter.count();
return Discount.defaultDiscounts();
}
@Override
List<Sale> getSales() {
salesCounter.count();
return Sale.defaultSales();
}
@Override
List<Coupon> getCoupons() {
couponsCounter.count();
return couponDAO.getDefaultCoupons();
}
}
所以我不得不通過增加一個Counter
類和
CouponDAO
修改我的構造函數。我很好,我需要再添加一個Counter
,調用couponsCounter
,因爲這是ShopFactory
的可數實現。但加入CouponDAO
對我來說並不好。
我想知道有沒有更好的解決方案如何做到這一點?
什麼使這些工廠? – weston