//接口
public interface Singer{
void sing();
}
public interface SongWriter{
void writeSong();
}
//实现
public class PureSinger implements Singer{
void sing(){}
}
public class SingerSongWriter implements Singer, SongWriter{
void sing(){}
void writeSong(){}
}
//客户端代码
void methodA(){
Singer objPureSinger = new PureSinger();
Singer objSingerSWer = new SingerSongWriter();
doSomething(objPureSinger);
doSomething(objSingerSWer);
}
public void doSomething(Singer obj){
obj.sing();
obj.writeSong(); //<--- this does not work.
}
为了获得这种类型的代码,我应该如何设计类结构?
答案 0 :(得分:1)
为了获得这种类型的代码,我应该如何设计类结构?
首先定义一个名为interface
的{{1}},它有一个名为Artist
的方法。接下来,定义两个子类,即perform
和Singer
,每个子类实现SongWriter
并包含分别唱歌和编写歌曲的代码。
以下两种设计模式可以很好地支持您的用例:
perform
是组件,Artist
和Singer
是具体组件< / em>和SongWriter
是您的抽象装饰器类。使用ArtistDecorator
将ArtistDecorator
打包成Singer
。 SongWriter
方法采用doSomething
参数,并将最终修饰的Artist
对象传递给Artist
{/ 1}}。Singer
是组件。 SongWriter
是 Composite ,Arist
和CompositeArtist
是 Leaf 或 Concrete Component 类。 Singer
方法采用SongWriter
参数。传递doSomething
的实例( IS-A Artist
),CompositeArtist
只调用Artist
,内部遍历所有doSomething
perform
1}}实例逐个调用他们的Artist
方法。 答案 1 :(得分:0)
你不应该假设在doSomething()中使用.writeSong(),因为你传递了一个参数 Singer ,我们知道Singer只有一个名为.sing的方法( )。这里有一些选择。
快速修复: 您需要首先查看obj是否是一个instanceOf SongWriter,因为传入的参数是 Singer 类型,它没有一个名为.writeSong()的方法。
public void doSomething(Singer obj){
obj.sing();
//obj.writeSong(); //<--- this does not work.
if (obj instanceOf SongWriter) songWriter.writeSong();
}
这是一个快速修复。您可以从下面的帖子中看到,您最后应该使用instanceOf。
答案 2 :(得分:0)
要快速回答问题doSomething
,请同时调用sing()
和writeSong()
方法。只有您的SingerSongWritter
类同时定义了这两个类,因此唯一可以同时执行这两个操作的类。 objPureSinger
没有writeSong
的定义,因此不知道在调用时该怎么做。
如果你想保持这个结构,你可以做的就是修复这个问题,在两个名为do
的类中实现一个方法。在PureSinger
课程中,do
只需拨打sing()
,但在SingerSongWriter
课程中,它会同时调用sing()
和writeSong()
。最后,在您的doSomething
方法中,只需致电obj.do();
答案 3 :(得分:0)
您可以根据业务需要设计课程。而且,很明显在
处获得编译时错误public void doSomething(Singer obj){
obj.sing();
obj.writeSong(); //<--- compiler will complain here
}
因为,Singer
没有writeSong
方法。根据您目前的设计:
Singer
只能sing
。SongWriter
只能writeSong
。但是,以上都不能兼得。因此,很明显doSomething
直到
doSomething (SingerSongWriter obj)
因为,只有SingerSongWriter
才能执行这两项工作。