C# 是否有一种模式可以组合第三方库提供的两个类?
我有两个来自第三方库的类,它们的功能非常相似,我们称它们为class Car和class Bike。我不能直接对类进行更改,但我希望能够抽象它们,以便像这样使用它们C# 是否有一种模式可以组合第三方库提供的两个类?,c#,design-patterns,C#,Design Patterns,我有两个来自第三方库的类,它们的功能非常相似,我们称它们为class Car和class Bike。我不能直接对类进行更改,但我希望能够抽象它们,以便像这样使用它们 public bool drive(IDriveable vehicle) { vehicle.Start(); vehicle.Shift(Gear.Drive); vehicle.Accelerate(); //so on... } 有什么我可以做的吗?也许这就是你要找的 在面向对象编程中,de
public bool drive(IDriveable vehicle)
{
vehicle.Start();
vehicle.Shift(Gear.Drive);
vehicle.Accelerate();
//so on...
}
有什么我可以做的吗?也许这就是你要找的
在面向对象编程中,decorator模式是一种设计模式,它允许静态或动态地将行为添加到单个对象,而不会影响同一类中其他对象的行为。decorator模式通常有助于坚持单一责任原则,因为它允许在具有独特关注领域的类之间划分功能。[2]decorator模式在结构上与责任链模式几乎相同,区别在于责任链中,只有一个类处理请求,而对于decorator,所有类都处理请求
我将创建一个
BikeDecorator
,和一个CarDecorator
,两者都实现IDriveable
,您需要创建一个新的接口IDriveable,其中包含您需要调用的所有函数。在这种情况下,例如,启动和加速。然后,创建两个类,分别是Car和Bike继承BaseCar、BaseBike和实现IDriveable。例如:
使用系统;
使用System.Collections.Generic;
公车
{
公开作废开始()
{
控制台写入线(“启动车辆”);
}
公共图书馆
{
控制台。WriteLine(“加速车”);
}
}
公共级自行车
{
公开作废开始()
{
控制台写入线(“启动自行车”);
}
公共图书馆
{
控制台。WriteLine(“加速自行车”);
}
}
接口IDriveable
{
void Start();
无效加速();
}
汽车类别:汽车,可驾驶
{
//要隐藏父函数,我们使用“new”。我们可以按基调用父函数。
新公共图书馆
{
base.Accelerate();
控制台。WriteLine(“加速CarChild”);
}
}
自行车等级:自行车,可驾驶
{
}
公共课程
{
公共静态void Main()
{
列表设备=新列表();
添加(新的CarChild());
添加(新的BikeChild());
所有(设备);
}
所有专用静态设备(列出设备)
{
foreach(设备中的var设备)
{
device.Start();
加速装置();
}
}
}
据我所知,您需要解决问题的是适配器模式。根据维基百科,适配器模式解决了以下问题:
- 如果一个类没有客户端所需的接口,该类如何重用
- 具有不兼容接口的类如何协同工作
- 如何为类提供替代接口
- 定义一个单独的适配器类来转换(不兼容) 类(适配器)到另一个接口(目标)的接口 客户要求
- 通过适配器处理(重用)没有 所需的接口
- 首先让我们假设第三方代码
public enum Gear
{
Drive,
Stop
}
汽车的第三方代码如下所示
public class Car
{
public void Start()
{
Console.Write($"Start Car");
}
public void Shift(Gear gear)
{
Console.Write($" Shift {gear}");
}
public void Accelerate()
{
Console.Write($" Accelerate Car");
}
}
类似地,自行车的第三方代码如下
public class Bike
{
public void Start()
{
Console.Write($"Start Bike");
}
public void Shift(Gear gear)
{
Console.Write($" Shift {gear}");
}
public void Accelerate()
{
Console.Write($" Accelerate Bike");
}
}
interface IDriveable
{
void Start();
void Shift(Gear gear);
void Accelerate();
}
class Program
{
private static void Main(string[] args)
{
// USING THE CAR
var car = new DriveableCar();
car.Start();
car.Shift(Gear.Drive);
car.Accelerate();
//USING THE BIKE
var bike = new DriveableBike();
bike.Start();
bike.Shift(Gear.Drive);
bike.Accelerate();
Console.Read();
}
}
然后我们可以如下定义接口
public class Bike
{
public void Start()
{
Console.Write($"Start Bike");
}
public void Shift(Gear gear)
{
Console.Write($" Shift {gear}");
}
public void Accelerate()
{
Console.Write($" Accelerate Bike");
}
}
interface IDriveable
{
void Start();
void Shift(Gear gear);
void Accelerate();
}
class Program
{
private static void Main(string[] args)
{
// USING THE CAR
var car = new DriveableCar();
car.Start();
car.Shift(Gear.Drive);
car.Accelerate();
//USING THE BIKE
var bike = new DriveableBike();
bike.Start();
bike.Shift(Gear.Drive);
bike.Accelerate();
Console.Read();
}
}
现在,我们可以为Car定义一个类,如下所示
class DriveableCar : IDriveable
{
private Car _car;
public DriveableCar()
{
_car = new Car();
}
public void Start()
{
_car.Start();
}
public void Accelerate()
{
_car.Accelerate();
}
public void Shift(Gear gear)
{
_car.Shift(gear);
}
}
对于自行车,我们可以定义另一类,如下所示
class DriveableBike : IDriveable
{
private Bike _bike;
public DriveableBike()
{
_bike = new Bike();
}
public void Start()
{
_bike.Start();
}
public void Shift(Gear gear)
{
_bike.Shift(gear);
}
public void Accelerate()
{
_bike.Accelerate();
}
}
现在我们可以使用第三方代码,如下所示
public class Bike
{
public void Start()
{
Console.Write($"Start Bike");
}
public void Shift(Gear gear)
{
Console.Write($" Shift {gear}");
}
public void Accelerate()
{
Console.Write($" Accelerate Bike");
}
}
interface IDriveable
{
void Start();
void Shift(Gear gear);
void Accelerate();
}
class Program
{
private static void Main(string[] args)
{
// USING THE CAR
var car = new DriveableCar();
car.Start();
car.Shift(Gear.Drive);
car.Accelerate();
//USING THE BIKE
var bike = new DriveableBike();
bike.Start();
bike.Shift(Gear.Drive);
bike.Accelerate();
Console.Read();
}
}
@程序员熟练,希望这能有所帮助。
CarWrapper
它实现了IDriveable
,并包含Car
的一个实例(作为字段/属性)。同样适用于BikeWrapper
。从Car或Bike派生并添加您的函数或用您的函数重写它的函数。@nish在像Accelerate()这样的接口中,我是否能够调用类似这样的东西。base()?@ProgrammerAdept您将是(尽管在类中不是接口)。这是decorator patternIMHO,我通过在我们的客户机中注入第三方组件来使用composition,或者我们可以说是consuming类。我有一个例子,你正在驾驶汽车内强制实例化汽车,也许你没有所有的信息来做这件事。我认为如果你提供外部(装饰师)的实例会更好。是的,因为我可以理解问题的状态,我们可以访问汽车,但不能更改。我不需要任何其他信息来实例化。当然,在真实场景中,我们可以通过任何DI容器进行注入。假设汽车有一个可变数量的参数,你们在DriveableCAR内会怎么做?复制所有构造函数?你为什么不喜欢脱衣舞呢?