定义:当一个类的一个对象完成某件事以后,这个对象通知另外类的一个对象开始执行另一件事.
代码举例:
class HairTeacher{
void makehHair(){
}
}
class HairWasher{
void washHair(HairTeacher hairT){
system.out.println("洗头发");
hairT.makeHandsome ();
}
}
class Entrance{
public static void main(String [] args){
HairWasher hw=new HairWasher();
hw.washHair(new HairTeacher ());
}
}
如果洗发师不仅仅要通知理发师,还可能要通知化妆师或服装师,应该怎么办?
我们创建一个类Beauty,是化妆师、理发师、服装师的父类
class Beauty{
void makeBeauty(){
system.out.println("变美");
}
}
class HairTeacher extends Beauty{
void makeBeauty(){
system.out.println("做头发");
}
}
class DressTeacher extends Beauty{
void makeBeauty(){
system.out.println("设计服装");
}
}
class FaceTeacher extends Beauty{
void makeBeauty(){
system.out.println("化妆");
}
}
class HairWasher{
void washHair(HairTeacher hairT){
system.out.println("洗头发");
hairT.makeHandsome ();
}
}
class Entrance{
public static void main(String[] args){
HairWasher hw=new HairWasher();
hw.washHair(new HairTeacher ());
hw.washHair(new DressTeacher());
hw.washHair(new FaceTeacher());
}
}
实际上,我们并不需要beauty类中的makebeauty方法,因为子类会复写makebeauty方法,那我们考虑将makebeauty方法写成抽象方法,将beauty类设为抽象类如何?
abstract class Beauty{
abstract void makeHandsome();
}
这样做还不是完美的,因为如果用抽象类,那每个具体的类(例如发型师,服装师,造型师)必须extends beauty类,为了一个洗头小妹的通知作用,浪费了宝贵的继承机会(一个类只有一个直接父类)。
所以最好的写法是将beauty变成一个接口,让每个具体的类(例如发型师,服装师,造型师)去implements beauty类
interface Beauty{
abstract void makeBeauty();
}
class HairTeacher implements Beauty{
void makeBeauty(){
system.out.println("做头发");
}
}
class DressTeacher implements Beauty{
void makeBeauty(){
system.out.println("设计服装");
}
}
class FaceTeacher implements Beauty{
void makeBeauty(){
system.out.println("化妆");
}
}