C#中没有继承的装饰器模式。这个对吗?

Decorator pattern in C# without Inheritance. Is this correct?

 public interface IMovable
    {
        void Move();
    }

    public interface IUnloadable
    {
        void Unload();
    }

    public class Vehicle : IMovable
    {
        public void Move()
        {
            Console.Write("moving");
        }
    }

    public class Truck : IMovable, IUnloadable
    {
        private Vehicle Veh;

        public Truck(Vehicle veh)
        {
            this.Veh = veh;
        }

        public void Move()
        {
            Veh.Move();
            Console.Write("reverse with beepy noise as well");
        }

        public void Unload()
        {
           Console.Write("Unload");
        }
    }

如果这是装饰者模式。装饰器模式和组合有什么区别?我已经看到使用继承的这种模式的示例。例如维基百科上的 Java 示例。

我完全没有看到使用继承的必要性,还是我遗漏了什么?

根据定义,装饰器模式将实现与其装饰的组件相同的接口。想法是客户端代码不需要更改。它可以依赖于之前使用的相同抽象。

例如:

public interface IMovable
{
    void Move();
}

public class Truck : IMovable
{
    public void Move()
    {
        Console.Write("moving");
    }
}

public class NoisyMovable : IMovable //1.Implement same interface
{
    private IMovable movable;
    public NoisyMovable(IMovable movable)//2.Wrap same interface
    {
        this.movable = movable;
    }

    public void Move()
    {
        movable.Move();            
        Console.Write("Make noise");
    }
}

如果您注意到 NoisyMovable class,它是一个装饰器,因为它实现了 IMovable 抽象并包装了它。

有了它,您就不必创建很多 class,例如 NoisyVehicleNoisyTruckNoisyCar 等。只需 CarTruck 够了;您可以使用单个装饰器添加噪音。

IMovable movable = new NoisyMovable(new Truck ());//Noisy Truck
IMovable movable = new NoisyMovable(new Car());//Noisy car
//etc

另一方面,组合不需要包装它实现的接口的相同实现。它可以实现一个接口并包装任何其他接口。

你错了,你的 Truck class 获取了 Vehicle 的实例。它不应该,而是应该采用 IMovable 的任何实例。它应该适用于 IMovable.

的任何实现

What is the difference between the decorator pattern and composition?

从概念上讲,装饰器修改它包装的(单个)对象的行为,而复合(模式)的行为基于它聚合的(多个)对象的组合。

I dont see the need to use inheritance at all, or am I missing something?

继承很有用,因此您可以拥有多个装饰器并嵌套它们。例如,SelfDriver 包装 Truck,包装 Vehicle。忽略 IUnloadable,第二个装饰器将是 SelfDriver:

代码如下所示:

IMovable sd = new SelfDriver(new Truck(new Vehicle())));

对象图如下所示: