场景引入
假设这样一种场景:当你身边有朋友过生日时,你会去给他(她)挑选礼物。那么我们在选礼物时,肯定会根据朋友的性别来给朋友选礼物。如果朋友是女性,你就会挑选适合女生的礼物(WomenGift);如果朋友是男性,你就会挑选适合男生的礼物(ManGift)。但是具体的礼物,比如书(Book)、花(Flower)这种其实都是适合送给男生和女生的。但是女生和男生的花和书又有很大的不同。这时,就相当于构成了下图:
如果按照只用继承去实现,那么就需要22=4的实现类,如果第一层的类别不断增加,比如有m种,第二层的类别也不断增大,比如有n种。那么就构成了nm种。再仔细看上图,如果我们分为两步来构建一个具体的类别,第一步是一层,第二层是第二层。这样就能使具体的实现类在很大的程度上进行缩减。只需要n+m个类就行实现。
代码实现
Gift
public abstract class Gift {
GiftImplement giftImplement ;
public Gift(GiftImplement giftImplement) {
this.giftImplement = giftImplement;
}
public abstract void operate();
}
ManGift
public class ManGift extends Gift{
public ManGift(GiftImplement giftImplement) {
super(giftImplement);
}
@Override
public void operate() {
System.out.println("这是针对男性礼物的具体不一样操作");
giftImplement.Name();
}
}
WomenGift
public class WomenGift extends Gift{
public WomenGift(GiftImplement giftImplement) {
super(giftImplement);
}
@Override
public void operate() {
System.out.println("针对女生礼物的特定操作");
giftImplement.Name();
}
}
Book
public class Book implements GiftImplement{
@Override
public void Name() {
System.out.println("我是一本书");
}
}
Flower
public class Flower implements GiftImplement {
@Override
public void Name() {
System.out.println("我是一朵花");
}
}
Test
public class Test {
public static void main(String[] args) {
Gift gift = new WomenGift(new Book());
gift.operate();
}
}