gpt4 book ai didi

c# - 关于装饰器和策略模式 C# 的设计 OOP 问题

转载 作者:太空宇宙 更新时间:2023-11-03 14:37:11 24 4
gpt4 key购买 nike

比如说你有一个基础抽象类

public abstract Foo
{
IFlyable _fly;
ISwimmable _swim;

void performSwim()
{
_swim.swim();
}

void performFly()
{
_fly.fly();
}
}

并拥有你将在你的系统中拥有的行为/算法

interface IFlyable { void fly(); }
interface ISwimmable { void swim(); }
interface IVoteable { void vote(); }

等等等等

现在你有多个实现它的类,具体包括 IFlyable、ISwimmable 等

class Bar: Foo { _swim = new ConcerteSwim(); }
class Baz: Foo { _fly = new ConcreteFly(); }

等等等等

一个是使用 Foo 基类中的策略模式来交换行为。

我们也可以使用装饰器模式用某些行为来包装它,但是由于装饰器用基类包装它,如果我们稍后添加更多行为到对象。由于随着我们添加更多行为,这些行为可能具有不同的签名,而不仅仅是例如调用装饰器

void performSwim()
{
swimWithMoreSpeed() + foo.performSwim()
}

我想我的问题是如果我添加更多的行为,我怎么能不修改基类并且仍然能够说添加 IWeaponBehavior、ISomeBehaviour 到一个类。

比如我想上课

public class XYF: Foo
{

}

但是我想给它一些 ISomeBehaviour 的行为,有没有一种方法可以说用这些行为来包装它,或者更像是一个 ConcreteFoo 用这些行为包装它现在做一些事情而不是实现接口(interface)在具体的 xyz 上,虽然这会让你实现如此多的具体行为类,如游泳行为、空行为等,但没有办法摆脱它。

有没有办法在设计模式中做到这一点?它几乎像是多种模式的混合体。

我知道,如果它像鸭子一样走路,像鸭子一样嘎嘎叫,但需要电池,那么你的抽象就有点问题了。

希望这是有道理的。

最佳答案

尝试装饰器模式。要支持新行为,您只需实现一个继承自 Foo 的新类,实现 IWeaponBehavior,并装饰另一个 Foo 对象。然后您现在可以将 WeaponDecorator 用作 FooIWeaponBehavior 并且仍然可以访问基础 Foo装饰。

基类:

public abstract Foo { void Jump(); }

具有基本行为的具体子类:

public Bar : Foo { void Jump() { /* jump! */ } }
public Baz : Foo { }

行为接口(interface):

interface IFlyable { void Fly(); }
interface ISwimmable { void Swim(); }

具有行为的装饰器子类:

public FlyableFoo : Foo, IFlyable
{
public Foo Base { get; set; }
public FlyableFoo(Foo base) { Base = base; }
void Fly() { Base.Jump(); /* fly! */ }
}

现在我们可以让任何 Foo 飞起来,使用其特定的 Jump() 实现:

Baz baz = new Baz();
FlyableFoo flybaz = new FlyableFoo(baz);
flybaz.Fly();

关于c# - 关于装饰器和策略模式 C# 的设计 OOP 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/543254/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com