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,例如 NoisyVehicle
、NoisyTruck
、NoisyCar
等。只需 Car
, Truck
够了;您可以使用单个装饰器添加噪音。
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())));
对象图如下所示:
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,例如 NoisyVehicle
、NoisyTruck
、NoisyCar
等。只需 Car
, Truck
够了;您可以使用单个装饰器添加噪音。
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())));
对象图如下所示: