继承的组成(进入设计模式)

问题描述 投票:0回答:1

因此,我开始学习一本名为“从头开始的设计模式”的书,并在其初始章节中给出了一个场景,其中以鸭类为例,构图比惯性更可取。

public abstract class Duck
{
   Swim()
       { 
          //all ducks can swim same way
       }
   abstract Look();// ducks can look different
}

因此,上述鸭子类别是由不同类型的鸭子以及某些假橡胶鸭子继承的。

(基于鸭子的类型)

      Duck obj=new IndoDuck();
         //Or
     //Duck obj =new MallardDuck();

     obj.Swim();
     obj.Look();

所以到现在为止看起来还不错。

现在进行了更改,为鸭子添加了飞行行为。

我们不能只将fly方法的行为添加到抽象鸭子类中,因为有一些伪造的鸭子不能飞行。

因此作者创建了一个IFly接口,该接口将由Flyable类和NonFlyable类实现。

interface IFly
{
 Fly();
}

Flyable: IFly
{
 Fly()
{
  // can fly
}
}

NonFlyable:IFly
{
 Fly()
{
  // cant fly
}
}

因此该IFly接口不会由所有不同的鸭子类实现,因为这将是一个巨大的变化,以向这些鸭子添加可飞行/不可飞行的行为。因此,在这里同意使用束缚似乎不是一个好主意。

作者建议IFly接口将在Duck类中用作组合。

public abstract class Duck
{
   Swim()
       { 
          //all ducks can swim same way
       }
   abstract Look();// ducks can look different

IFly Fly();
}

所以现在我能做的是。

      Duck obj=new IndoDuck();
         //Or
     //Duck obj =new MallardDuck();

     obj.Swim();
     obj.Look();
obj.Fly =new Flyable();
//or
obj.Fly=new NonFlyable();

所以我的问题是我如何根据类型知道是要添加Flyable功能还是将NonFlyable设置为某个地方,我必须告诉我的每个鸭子类它们飞行还是不正确?那么,构图如何真正解决我无法联系或错过的问题呢?请帮助。

design-patterns composition
1个回答
0
投票

所以我的问题是我如何根据类型知道是要添加Flyable功能还是将NonFlyable设置为某个位置,我必须告诉我的每个鸭子类它们飞还是不飞

决定使用哪个IFly子类来创建鸭子的代码通常位于Factory类中。这样的[[Factory类的直接而简单的实现将类似于:

public class DuckFactory { public static Duck createDuck(DuckType type) { if(DuckType.FlyableMallard.equals(type) { return new MallardDuck(new Flyable()); } else if(..) { } } }
然后,一个简单的主程序可以通过简单地传递从命令行接收的类型来创建Duck实例:

Duck duck = DuckFactory.create(DuckType.FlyableMallard);

© www.soinside.com 2019 - 2024. All rights reserved.