装饰者模式的例子

时间:2013-11-21 15:02:37

标签: c# design-patterns

我正在浏览Decorator设计模式并看到每个第二个示例都使用 抽象装饰器类 ,并且还实现了类的接口,装饰器将是创建。我的问题是,

  1. 是否需要有一个抽象装饰器类,然后定义具体的装饰器?

  2. 我创建了一个样本,我认为它可以类似于上面提到的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;
       }
     }
    

    我们可以说这是装饰模式的一个例子吗?

3 个答案:

答案 0 :(得分:3)

更新

  

我们真的需要将装饰器作为抽象类吗?

我猜你可以避免使用abstract,但是你必须为所有类编写相同的代码。 abstract的目的是避免冗余代码并确保您的类符合相同的逻辑。此外,它更容易维护和扩展。

Decorator Pattern

答案 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;
    }
}