我正在浏览Decorator设计模式并看到每个第二个示例都使用 抽象装饰器类 ,并且还实现了类的接口,装饰器将是创建。我的问题是,
是否需要有一个抽象装饰器类,然后定义具体的装饰器?
我创建了一个样本,我认为它可以类似于上面提到的Abstract类方法所实现的功能。
public interface ICarModel
{
Int32 Price { get; }
Int32 Tax { get; }
}
public class BaseModel : ICarModel
{
public Int32 Price
{
get { return 50000; }
}
public Int32 Tax
{
get { return 5000; }
}
public String GetBaseCarDetails()
{
return "Base car model Price is : " + this.Price
+ " and Tax is : " + this.Tax;
}
}
public class LuxuryModel
{
ICarModel _iCarModel;
public LuxuryModel(ICarModel iCarModel)
{
_iCarModel = iCarModel;
}
public Int32 Price
{
get { return _iCarModel.Price + 10000; }
}
public Int32 Tax
{
get { return _iCarModel.Tax + 3000; }
}
public String GetLuxuryCarDetails()
{
return "Luxury car model Price is : " + this.Price
+ " and Tax is : " + this.Tax;
}
}
我们可以说这是装饰模式的一个例子吗?
答案 0 :(得分:3)
我们真的需要将装饰器作为抽象类吗?
我猜你可以避免使用abstract
,但是你必须为所有类编写相同的代码。 abstract
的目的是避免冗余代码并确保您的类符合相同的逻辑。此外,它更容易维护和扩展。
答案 1 :(得分:3)
装饰器模式的目的只是扩展现有类型的行为,使得该类型的使用者不需要知道它如何更改的实现细节。
不要求任何类型是抽象的。您可以使用接口或具体类的虚方法来执行此操作。
答案 2 :(得分:2)
Model1是一个装饰器,它将'getPrice'逻辑的一部分委托给decoree'CarModel'
class Model1 implements IModel
{
IModel m_model;
Model1(CarModel model){
m_model = model;
}
public int getPrice(){
return m_model.getPrice() + getModelSpecificPrice();
}
protected int getModelSpecificPrice(){
return 10;
}
}
但是如果有Model2,Model3等,其'getPrice'方法的逻辑是相同的呢?
在这种情况下,创建一个抽象装饰器
是有意义的class AbstractModel implements IModel{
IModel m_model;
AbstractModel(CarModel model){
m_model = model;
}
public int getPrice(){
return m_model.getPrice() + getModelSpecificPrice();
}
abstract protected int getModelSpecificPrice();
}
class Model1 extends AbstractModel
{
Model1(CarModel model){
super(model);
}
protected int getModelSpecificPrice(){
return 10;
}
}